2010-10-24 16 views
5

Sto lavorando ad una ListActivity che mostrerà un mucchio di numeri (pesi). Vorrei cambiare lo sfondo di una riga specifica in ListView. Per fare ciò ho creato un'implementazione personalizzata della classe ArrayAdapter e ho sostituito il metodo getView. L'adattatore accetta un elenco di numeri e imposta lo sfondo della riga con il numero 20 in giallo (per ragioni di semplicità).Custom ArrayAdapter setBackground in getView

public class WeightListAdapter extends ArrayAdapter<Integer> { 

    private List<Integer> mWeights; 

    public WeightListAdapter(Context context, List<Integer> objects) { 
     super(context, android.R.layout.simple_list_item_1, objects); 

     mWeights = objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = super.getView(position, convertView, parent); 

     int itemWeight = mWeights.get(position); 
     if (itemWeight == 20) { 
      v.setBackgroundColor(Color.YELLOW); 
     } 
     return v; 
    } 

} 

Il problema è che non solo la riga con il numero 20 diventa lo sfondo giallo, ma anche la riga con il numero 0 (la prima riga che è) e non sono sicuro perché questo è così.

Sto facendo qualcosa di sbagliato nel metodo getView (come chiamare il metodo super)? Il mio ragionamento per l'implementazione è: Tutte le visualizzazioni restituite dovrebbero essere uguali (ecco perché sto chiamando il metodo super) solo la vista che soddisfa i criteri if deve essere cambiata.

Grazie per il vostro aiuto!

risposta

3

Ho fatto un po 'di ricerche per scoprire come questo dovrebbe essere fatto correttamente.

Sto scrivendo questo per gli altri con lo stesso problema, perché immagino che questo sia il modo corretto di farlo. Per favore, fammi sapere, se mi sbaglio o se questa soluzione ha qualche difetto che non vedo.

public class WeightListAdapter extends ArrayAdapter<Integer> { 

    private static final int TYPE_COUNT = 2; 
    private static final int TYPE_ITEM_COLORED = 1; 
    private static final int TYPE_ITEM_NORMAL = 0; 

    public WeightListAdapter(Context context, List<Integer> objects) { 
    super(context, android.R.layout.simple_list_item_1, objects); 
    } 

    @Override 
    public int getViewTypeCount() { 
    return TYPE_COUNT; 
    } 

    @Override 
    public int getItemViewType(int position) { 
    int item = getItem(position); 

    return (item == 30) ? TYPE_ITEM_COLORED : TYPE_ITEM_NORMAL; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View v = super.getView(position, convertView, parent); 
    switch (getItemViewType(position)) { 
    case TYPE_ITEM_COLORED: 
     v.setBackgroundColor(Color.YELLOW); 
     break; 
    case TYPE_ITEM_NORMAL: 
     break; 
    } 

    return v; 

    } 
} 

Apparentemente classe base implementa già la logica garantire la corretta convertView viene passato al metodo getView (basato su metodi getViewItemType e getViewTypeCount).

1

La vista di Android è riutilizzare un componente per ogni riga. Ho anche questo problema.

+0

Vedo. Questo avrebbe senso, sì. Quindi la domanda ora è qual è il modo migliore per risolverlo. Abbandonare convertView o impostare gli attributi di stile per entrambe le opzioni? – Igor

1

Se è dovuto al riutilizzo, perché non aggiungere un altro controllo se itemWeight non è uguale a 20? Se non è uguale, riporta lo sfondo alla normalità.

+0

Sì, ci ho pensato, ma ho fatto un po 'di ricerche e ho trovato un'altra soluzione. – Igor

Problemi correlati