2011-01-10 6 views
45

Ho una vista Android Spinner nel mio layout. Mi piacerebbe che lo spinner mostrasse solo un singolo elemento di testo quando è chiuso, ma quando l'utente fa clic su di esso (cioè apre la finestra di dialogo dello spinner) mi piacerebbe mostrare informazioni più estese per ogni oggetto, tra cui un'icona e una vista testo di descrizione aggiuntiva . Come ora, lo spinner mostra lo stesso layout (icona, titolo + descrizione) in entrambi gli stati.Spinner Android con diversi layout per "drop down state" e "closed state"?

Se collego un ArrayAdapter allo spinner, ho accesso a qualcosa chiamato "setDropDownViewResource" ma non è necessariamente quello di cui ho bisogno, dal momento che i miei dati di spinner sono recuperati da un cursore non da una matrice di alcun tipo (ho , a partire da ora, ha creato il mio adattatore, estendendo BaseAdapter).

Chiunque può aiutarmi?

+1

Vedere la mia risposta su http://stackoverflow.com/questions/4880413/text-color-of-a-closed-spinner/34264463#34264463 –

+0

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

risposta

83

È necessario creare una classe personalizzata Adapter per lo Spinner e sovrascrivere i due metodi getView() per la visualizzazione normale chiusa e getDropDownView() per la visualizzazione elenco a discesa. Entrambi i metodi devono restituire un oggetto View per un singolo elemento.

Dai un'occhiata a this tutorial potrebbe aiutarti a iniziare.

+0

Ottimo suggerimento, che indica esattamente quello che stavo cercando :-) – dbm

+0

Mi ci è voluto un po 'per trovarlo, ma esattamente quello che stavo cercando! – Rabbott

+0

Ottimo consiglio, questo era quello che stavo cercando! Ohh my goood: O Grazie mille – TiagoM

7

Anche io stavo avendo problemi. Piuttosto che scavalcare la classe, ho un modo più semplice per farlo.

Ma prima è necessario comprendere la differenza tra l'ID risorsa nel costruttore dell'adattatore e l'altro in setDropDownViewResource. Ad esempio,

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 è lo stile per filatore, e R.layout.actionbar_list_item per ogni voce di lista unica. Ho usato SimpleAdapter qui, poiché se uso ArrayAdapter, l'xml può essere solo un singolo TextView. R.layout.actionbar_list_item contiene un TextView il cui id è event_id e un ImageView il cui id è icona. R.layout.actionbar_dropdown è quasi esattamente lo stesso di actionbar_list_item. Ma la visibilità di ImageView di quest'ultimo è impostata su GONE.

In questo modo ogni voce di elenco ha una vista testuale e un'immagine, ma vedrete solo una vista testuale sullo spinner.

+0

Questa dovrebbe essere la risposta corretta in quanto è molto più facile da implementare rispetto a quella di Flo (questa soluzione funziona altrettanto bene e potrebbe essere necessaria in alcuni casi, ma non strettamente necessaria per la domanda dell'OP .) – Kevin

+0

Eccellente - consiglia! – RMcGuigan

5

Utilizzando il codice del tutorial collegato da Flo, ho creato il seguente CustomSpinnerAdapter per mostrare due diversi gruppi di stringhe, una quando gli elementi sono visualizzati e uno quando no. Spero che aiuti qualcuno.

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; 
} 
} 

E l'utilizzo all'interno di un frammento:

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

Infine, il layout per l'elemento filatore:

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

Si dovrebbe fare uso del parametro 'convertView' nei metodi' getView() 'e' getDropDownView() '. – Gus

+0

Bello e chiaro. –

3

imposta solo la discesa visualizza la risorsa con il layout 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); 

Per me, è solo un layout con una imbottitura extra a sinistra, perché il mio sfondo di spinner è un drawable arrotondato e richiedono questo spazio extra.