Android Spinner con diferentes diseños para “estado desplegable” y “estado cerrado”?

Tengo una vista de Android Spinner en mi diseño. Me gustaría que el girador muestre solo un elemento de texto cuando está cerrado, pero cuando el usuario hace clic en él (es decir, abre el cuadro de diálogo giratorio) me gustaría mostrar información más detallada para cada elemento, incluyendo un icono y una descripción adicional . Como es ahora, la flecha muestra el mismo diseño (icono, título + descripción) en ambos estados.

Si conecto un ArrayAdapter al spinner, entonces obtengo acceso a algo llamado “setDropDownViewResource” pero eso no es necesariamente lo que necesito, ya que mis datos de spinner son extraídos de un Cursor no de un Array de ningún tipo (lo tengo, a partir de ahora , creé mi propio adaptador, extendiendo BaseAdapter).

¿Alguien que pueda ayudarme?

getView() crear una clase Adapter personalizada para el Spinner y sobrescribir los dos métodos getView() para la vista cerrada normal y getDropDownView() para la vista de la lista desplegable. Ambos métodos deben devolver un objeto View para un solo elemento.

Echa un vistazo a este tutorial que podría ayudarte a comenzar.

Yo también estaba teniendo un problema. En lugar de anular la clase, tengo una manera más fácil de hacer esto.

Pero primero debe comprender la diferencia entre el ID del recurso en el constructor del adaptador y el otro en setDropDownViewResource(...) . Por ejemplo,

 SimpleAdapter adapter = new SimpleAdapter(ab.getThemedContext(), data, R.layout.actionbar_dropdown, new String[] { "EventID", "Icon" }, new int[] { R.id.event_id, R.id.icon }); adapter.setDropDownViewResource(R.layout.actionbar_list_item); 

R.layout.actionbar_dropdown es el estilo de spinner , y R.layout.actionbar_list_item para cada elemento de la lista.

Usé SimpleAdapter aquí, ya que si uso ArrayAdapter, el xml solo puede ser un TextView.

R.layout.actionbar_list_item contiene un TextView cuyo id es event_id y un ImageView cuyo id es icon .

R.layout.actionbar_dropdown es casi exactamente lo mismo que actionbar_list_item , pero la visibilidad de ImageView de este último se establece en GONE .

De esta forma, cada elemento de la lista tiene una vista de texto y una vista de imagen, pero solo verá una vista de texto en la rueda giratoria.

Utilizando el código del tutorial vinculado por Flo, creé el siguiente CustomSpinnerAdapter para mostrar dos conjuntos diferentes de cadenas, una cuando se muestran los elementos y otra cuando no. Espero que esto ayude a alguien.

 public class CustomSpinnerAdapter extends ArrayAdapter { Context mContext; int mTextViewResourceId; String[] mObjects; String[] mShortNameObjects; public CustomSpinnerAdapter(Context context, int textViewResourceId, String[] objects, String[] shortNameObjects) { super(context, textViewResourceId, objects); mContext = context; mTextViewResourceId = textViewResourceId; mObjects = objects; mShortNameObjects = shortNameObjects; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false); row.setText(mObjects[position]); return row; } @Override public View getView(int position, View convertView, ViewGroup parent) { return getCustomView(position, convertView, parent); } public View getCustomView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); TextView row = (TextView) inflater.inflate(mTextViewResourceId, parent, false); row.setText(mShortNameObjects[position]); return row; } } 

Y el uso dentro de un Fragmento :

 CustomSpinnerAdapter mSpinnerAdapter = new CustomSpinnerAdapter(getActivity(), R.layout.spinner_item, getResources().getStringArray(R.array.action_filter), getResources().getStringArray(R.array.action_filter_short_names)); 

Finalmente, el diseño para el elemento de giro:

spinner_item.xml

   

Solo establece el recurso de vista desplegable con su diseño alternativo:

 ArrayAdapter genderAdapter = new ArrayAdapter<>(this, R.layout.adapter_spinner_white, Constants.GENDER); genderAdapter.setDropDownViewResource(R.layout.adapter_spinner_white_dropdown); view.setAdapter(genderAdapter); 

Para mí, es solo un diseño con un relleno adicional a la izquierda, porque mi fondo de spinner es redondo y requiere este espacio extra.

Simplemente llame al método setUpSpinner () después de obtener una referencia a spinner

// aquí está el método setUpSpinner

 private void setupSpinner() { // Create adapter for spinner. The list options are from the String array it will use // the spinner will use the default layout ArrayAdapter spinnerAdapter = ArrayAdapter.createFromResource(this, R.array.array_dropdown_options, android.R.layout.simple_spinner_item); // Specify dropdown layout style - simple list view with 1 item per line spinnerAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line); // Apply the adapter to the spinner spinner.setAdapter(spinnerAdapter); // spinner is referenced spinner by finViewById. spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { String selection = (String) parent.getItemAtPosition(position); if (!TextUtils.isEmpty(selection)) { if (selection.equals(getString(R.string.item_a))) { // your code for selected item whose id equals to id to R.string.item_a } else if (selection.equals(getString(R.string.item_b))) { // your code } else { // your code } } } // Because AdapterView is an abstract class, onNothingSelected must be defined @Override public void onNothingSelected(AdapterView parent) { // code for nothing selected in dropdown } }); }