Как добавить spinner для субтитров - как в приложении Play Music для Android?

Play Music screenshot

Обратитесь к прилагаемому изображению.

setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback) добавляет прядильник, вращающийся в разделе "Моя библиотека", и я не могу добавить под ним список подписок. Я не могу найти метод, который добавляет прядильщик для "ALL MUSIC", а не вмешивается в основное название панели действий.

Любая помощь приветствуется!

Ответ 1

Он выглядит как настроенный ArrayAdapter Вам нужно реализовать getDropDownView и вернуть представление, которое вы хотели бы видеть.

Не стесняйтесь изменять код. Это просто доказательство концепции. В вашей деятельности:

getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    getActionBar().setTitle("");

    getActionBar().setListNavigationCallbacks(new MySpinnerAdapter(this, R.layout.customspinneritem, items), new OnNavigationListener() {

        @Override
        public boolean onNavigationItemSelected(int itemPosition, long itemId) {

            return false;
        }
    });

MySpinnerAdapter:

 public class MySpinnerAdapter extends ArrayAdapter<String>{

// CUSTOM SPINNER ADAPTER
private Context mContext;
public MySpinnerAdapter(Context context, int textViewResourceId,
        String[] objects) {
    super(context, textViewResourceId, objects);

    mContext = context;
    // TODO Auto-generated constructor stub
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    return getCustomView(position, convertView, parent);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    return getCustomView(position, convertView, parent);
}

public View getCustomView(int position, View convertView,ViewGroup parent) {
// TODO Auto-generated method stub
// return super.getView(position, convertView, parent);


LayoutInflater inflater =  
    ( LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.customspinneritem, null);
holder = new ViewHolder();
holder.txt01 = (TextView) convertView.findViewById(R.id.TextView01);
holder.txt02 = (TextView) convertView.findViewById(R.id.TextView02);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();
}

holder.txt01.setText("My Library");
holder.txt02.setText("ALL MUSIC");

return convertView;
}

class ViewHolder {
    TextView txt01;
    TextView txt02;
}



} // end custom adapter

enter image description here

Ответ 2

Я не могу комментировать ответы еще из-за моей репутации, но для реализации этого так же, как приложение Google Music, я думаю, вы хотели бы использовать другой метод для getDropDownView(), потому что выпадающее меню в Google Music как обычный выпадающий список.

Замена метода prijupaul следующим образом - идея, для которой вы бы искали.

Вот так:

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    DropDownViewHolder holder = null;

    if (convertView == null) {
        LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
        convertView = inflater.inflate(R.layout.dropdown_list_item, parent, false);

        holder = new DropDownViewHolder();
        holder.mTitle = (TextView) convertView.findViewById(R.id.textView_dropdown_title);

        convertView.setTag(holder);
    } else {
        holder = (DropDownViewHolder) convertView.getTag();
    }

    // Should have some sort of data set to go off of, we'll assume
    // there is a some array called mData.
    holder.mTitle.setText(mData[position]);

    return convertView;
}

public class DropDownViewHolder {
    TextView mTitle;
}

Я решил, что код должен быть явным.

Ответ 3

Вот решение. Нам нужно создать другой метод для getView (...), а также нужно отслеживать элемент, выбранный из раскрывающегося списка. Как только элемент из ящика навигации щелкнут, вызовите новый метод (создайте новый метод в адаптере spinner в качестве заголовка обновления) llike

public void setHeaderTitle(String str) { titleTxt = str; }

Разный метод, вызванный из представления view

@Override
     public View getView(int position, View convertView, ViewGroup parent) {

        return getBarView(position);
    }

private View getBarView(int position) {
        if (displayHolder == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView1 = inflater.inflate(R.layout.actionbar_spinner_item, null);
            displayHolder = new ViewHolder();
        }

        displayHolder.txt01 = (TextView) convertView1.findViewById(R.id.actionBarTitle123);
        displayHolder.txt02 = (TextView) convertView1.findViewById(R.id.actionBarSubTitle123);
        displayHolder.txt01.setText(titleTxt);
        displayHolder.txt02.setText(items[curPos]);

        return convertView1;
    }

И при выпадающем элементе выбирается вызов ниже метода

public void setHeaderSubTitle(int pos) {

        // update display of sub title
        curPos = pos;
        getBarView(pos);
    }

Позвольте мне знать, что нужно еще что-нибудь.