2011-01-10 12 views
45

Tengo una vista de giro de Android 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.Android Spinner con diferentes diseños para "estado desplegable" y "estado cerrado"?

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

¿Alguien que me puede ayudar?

+1

Consulte mi respuesta en http://stackoverflow.com/questions/4880413/text-color-of-a-closed-spinner/34264463#34264463 –

+0

http://stackoverflow.com/questions/4880413/text- color-de-un-cerrado-spinner/34264463 # 34264463 –

Respuesta

83

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

Eche un vistazo a this tutorial podría ayudarle a comenzar.

+0

Un gran consejo, que apunta exactamente a lo que estaba buscando :-) – dbm

+0

Me tomó un tiempo encontrarlo, ¡pero exactamente lo que estaba buscando! – Rabbott

+0

¡Un gran consejo, esto era lo que estaba buscando! Ohh my goood: O Muchísimas gracias – TiagoM

7

Yo estaba teniendo un problema también. 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 para spinner, y R.layout.actionbar_list_item para cada elemento de la lista única. 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 ícono. 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 ruleta.

+0

Esta debería ser la respuesta correcta, ya que es mucho más fácil de implementar que la de Flo (esa solución funciona bien y puede ser necesaria en ciertos casos, simplemente no es estrictamente necesaria para la pregunta del OP .) – Kevin

+0

Excelente - ¡tengo una recomendación! – RMcGuigan

5

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 una 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)); 

Por último, la disposición para el 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" /> 
+0

Debería hacer uso del parámetro 'convertView' en sus métodos' getView() 'y' getDropDownView() '. – Gus

+0

Agradable y claro. –

3

establece Sólo en el menú desplegable ver recurso 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 sólo un diseño con un relleno adicional a la izquierda, porque mi fondo de la ruleta es un dibujable redondeada y requieren este espacio extra.

Cuestiones relacionadas