Android Spinner con diferentes diseños para "drop down state" y "closed state"?
Tengo una vista de Android Spinner en mi diseño. Quisiera que el hilandero mostrara solamente un solo artículo del texto cuando esté cerrado, pero cuando el usuario hace clic en él (es decir abre el diálogo del hilandero) quisiera mostrar la información más extensa para cada artículo, incluyendo un icono y una descripción adicional del texto de la descripción . Como ahora es el spinner muestra el mismo diseño (icono, título + descripción) en ambos estados.
Si adjunto un ArrayAdapter al spinner, entonces tengo acceso a algo llamado "setDropDownViewResource", pero eso no es necesariamente lo que necesito, ya que mis datos spinner se obtiene de un Cursor no de un Array de cualquier tipo (tengo, a partir de ahora , Creé mi propio adaptador, extendiendo BaseAdapter).
- Cómo hacer una fecha spinner en Android
- Spinner Dropdown CheckedTextView Autoscroll
- Android Spinner dropDownHorizontalOffset no funciona pero dropDownVerticleOffest es
- Mostrar desplegable programaticamente en ActionBar / ActionBarSherlock
- ¿Hay un AppCompat equivalente de Widget.Material.Spinner.Underlined?
¿Alguien que me pueda ayudar?
- Spinner no está trabajando en android
- El girador se desplaza hacia arriba cuando está encendidoPulse o desplaza lentamente
- ¿Hay alguna manera de usar setOnClickListener con un Spinner de Android?
- Android: ¿Dónde está escondido el atributo de color del texto del widget Spinner?
- Android: configura Spinner para usar array
- Establecimiento de hilanderos en fragmento
- Spinner no parece apropiado
- Android - Spinner, onItemSelected (...) no se llama
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 lista desplegable. Ambos métodos deben devolver un objeto View
para un solo elemento.
Echa un vistazo a este tutorial que puede ayudarte a empezar.
Yo estaba teniendo problema también. En lugar de reemplazar a la clase, tengo una manera más fácil de hacer esto.
Pero primero debes entender la diferencia entre el id de 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 lista. He utilizado SimpleAdapter aquí, ya que si uso ArrayAdapter, el xml sólo puede ser un solo TextView. R.layout.actionbar_list_item contiene un TextView cuyo id es event_id y un ImageView cuyo id es icono. 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 manera, cada elemento de lista tiene una vista de texto y una vista de imagen, pero solo verá una vista de texto en la hiladora.
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<String> { 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 del elemento giratorio:
Spinner_item.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="18dip" android:gravity="left" android:textColor="@color/navdraw_list_item_background_default" android:padding="5dip" />
Sólo establece el recurso de vista desplegable con el diseño alternativo:
ArrayAdapter<String> 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 sólo un diseño con un relleno adicional a la izquierda, porque mi fondo de spinner es un redondeado dibujable y requieren este espacio extra.
- ManagedQuery () vs context.getContentResolver.query () vs android.provider.something.query ()
- Convertir mapa de bits en byteArray android