Personalización del spinner de Actionbar

Estoy tratando de personalizar el androide actionbar spinner a algo que como la aplicación de Google Corrientes. Básicamente, sólo el "subtítulo" debe reflejar lo que elijo de la ruleta mientras que el "título" sigue siendo el mismo. Entiendo que un spinner personalizado necesita ser creado y tengo que sobrescribir el getView() y getDropDownView() . Pero estoy muy confundido aquí sobre cómo anular estos métodos correctamente. Pueden algunos por favor empujarme en la dirección correcta. Espero haber hecho mi pregunta clara.

La imagen de la imagen http://androidcowboy.com/wp-content/uploads/2012/12/google-currents-3a.jpg

A continuación se muestra mi código.

 public class CustomSpinnerAdapter extends BaseAdapter { private LayoutInflater inflater; private final Context context; private final String[] dropDown; private final String mainText; private final String subText; public CustomSpinnerAdapter(Context context, String mainText, String subText,String[] dropDown) { inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.mainText=mainText; this.subText=subText; this.context = context; this.dropDown=dropDown; } @Override public int getCount() { // TODO Auto-generated method stub return 0; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View actionBarView = inflater.inflate(R.layout.custom_spinner, null); TextView textView = (TextView) actionBarView .findViewById(R.id.custom_spinner_textview); textView.setText(mainText); return actionBarView; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { View dropDownView = inflater.inflate(R.layout.custom_spinner, null); TextView dropDownTextView = (TextView) dropDownView .findViewById(R.id.custom_spinner_dropdown_textview); dropDownTextView.setText(dropDown[position]); return dropDownView; } } 

Lo solucioné.

Listado de mi clase de adaptador:

 public class AdapterBaseMaps extends BaseAdapter { Context context; int layoutResourceId; ArrayList<ObjectLayers> data; LayoutInflater inflater; public AdapterBaseMaps(Context context, int textViewResourceId, ArrayList<ObjectLayers> data) { // super(a, textViewResourceId, data); this.data = data; inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.context = context; this.layoutResourceId = textViewResourceId; } @Override public View getView(int position, View convertView, ViewGroup parent) { View actionBarView = inflater.inflate(R.layout.ab_main_view, null); TextView title = (TextView) actionBarView .findViewById(R.id.ab_basemaps_title); TextView subtitle = (TextView) actionBarView .findViewById(R.id.ab_basemaps_subtitle); title.setText(context.getResources() .getString(R.string.label_cartravel)); subtitle.setText(data.get(position).getLayerName()); return actionBarView; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { View actionBarDropDownView = inflater.inflate( R.layout.ab_dropdown_view, null); TextView dropDownTitle = (TextView) actionBarDropDownView .findViewById(R.id.ab_basemaps_dropdown_title); dropDownTitle.setText(data.get(position).getLayerName()); return actionBarDropDownView; } @Override public int getCount() { // TODO Auto-generated method stub return data.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } } 

Listado de ab_main_view.xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:id="@+id/ab_basemaps_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:textSize="20sp" android:textColor="@color/White" /> <TextView android:id="@+id/ab_basemaps_subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ab_basemaps_title" android:text="TextView" android:textColor="@color/White" android:textSize="13sp" /> </RelativeLayout> 

Listado de ab_dropdown_view.xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:id="@+id/ab_basemaps_dropdown_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:textSize="20sp" android:padding="5dp" android:textColor="@color/White" /> </RelativeLayout> 

La primera respuesta es útil, pero la subclase Adapter es innecesaria.

Defina XML como en la respuesta de @ user1624587 y luego simplemente haga referencia a ella en public boolean onCreateOptionsMenu(Menu menu) :

  ArrayAdapter<CharSequence> someAdapter = new ArrayAdapter<CharSequence>(context, R.layout.ab_main_view, android.R.id.text1, getResources().getStringArray(R.array.some_array)); someAdapter.setDropDownViewResource(R.layout.ab_dropdown); MenuItem item = menu.add("SomeTitle").setActionView(R.layout.some_spinner); item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); //or whatever someSpinner = (someSpinner) item.getActionView(); someSpinner.setAdapter(someAdapter); ...etc 
  • No puedo ver el progreso de spinner en ProgressDialog en Lollipop
  • Android onListItemClick no funciona cuando los hilanderos se encuentran dentro de listrow
  • Establecer foco en el hilador cuando se selecciona en android
  • Mueva la flecha giratoria hacia la izquierda cerca del texto
  • Cómo crear editable spinner en android?
  • Cómo establecer la posición en el hilandero?
  • Diferencia entre android.R.layout.simple_spinner_dropdown_item y android.R.layout.simple_spinner_item
  • Crear un hilandero por programación android
  • Cómo ocultar un elemento en un Spinner de Android
  • Spinner onItemSelected llamado erróneamente (sin acción del usuario)
  • Spinner error gráfico API 21
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.