style studio llenar ejemplo custom android spinner android-spinner

studio - ¿Spinner de Android con diferentes diseños para "estado desplegable" y "estado cerrado"?



spinner android material design (5)

Tengo una vista de Spinner de Android en mi diseño. Me gustaría que esa rueda giratoria muestre solo un elemento de texto cuando esté cerrado, pero cuando el usuario haga clic en él (es decir, abra el cuadro de diálogo de la rueda giratoria), me gustaría mostrar información más extensa para cada elemento, incluido un icono y una descripción adicional de vista de texto. . Tal como está ahora, la rueda giratoria muestra el mismo diseño (icono, título y descripción) en ambos estados.

Si adjunto un ArrayAdapter a la ruleta, obtengo acceso a algo llamado "setDropDownViewResource", pero eso no es necesariamente lo que necesito, ya que mis datos de la ruleta se obtienen de un Cursor y no de una Matriz de ningún tipo (tengo, a partir de ahora , creé mi propio adaptador, extendiendo BaseAdapter).

¿Alguien que pueda ayudarme?


Simplemente llame al método setUpSpinner () después de obtener la referencia al 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 } }); }


Solo establece el recurso de vista desplegable con su 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 solo un diseño con un relleno adicional a la izquierda, porque mi fondo de giro es un dibujo redondeado y requiere este espacio adicional.


Usando 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 spinner:

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" />


Yo también estaba teniendo problemas. 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 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 para spinner y R.layout.actionbar_list_item para cada elemento de una sola lista.

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

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

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

De esta manera, 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.


getView() crear una clase de 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 podría ayudarte a comenzar.