2010-10-24 15 views
5

Estoy trabajando en una ListActivity que mostrará un montón de números (pesos). Me gustaría cambiar el fondo de una fila específica en el ListView. Para hacer esto, he creado una implementación personalizada de la clase ArrayAdapter y he anulado el método getView. El adaptador acepta una lista de números y establece el fondo de la fila con el número 20 en amarillo (por razones de simplicidad).Custom ArrayAdapter setPrincipal en 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; 
    } 

} 

El problema es que no sólo la fila con el número 20 se pone el fondo amarillo, sino también la fila con el número 0 (la primera fila que es) y no estoy seguro de por qué esto es así.

¿Estoy haciendo algo mal en el método getView (como llamar al método súper)? Mi razonamiento para la implementación es: todas las vistas devueltas deben ser iguales (es por eso que estoy llamando al método super), solo la vista que se ajusta al criterio if debe cambiarse.

Gracias por su ayuda!

Respuesta

3

Hice un poco de investigación para descubrir cómo esto se debe hacer correctamente.

Estoy escribiendo esto para los demás con el mismo problema, ya que supongo que esta es la manera correcta de hacerlo. Por favor, avíseme si estoy equivocado o si esta solución tiene algún defecto que no veo.

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; 

    } 
} 

Aparentemente la clase base ya implementa la lógica de garantizar la correcta convertView se pasa a la getView método (basado en los métodos getViewItemType y getViewTypeCount).

1

La vista de Android es reutilizar un componente para cada fila. También tengo este problema.

+0

Ya veo. Esto tendría sentido, sí. Entonces la pregunta ahora es cuál es la mejor manera de resolver esto. ¿Desechar el convertView o establecer los atributos de estilo para ambas opciones, si es que el resto? – Igor

1

Si es por reutilización, ¿por qué no agrega otro cheque si el artículo pesa menos de 20? Si no es igual, entonces establezca el fondo de nuevo en normal.

+0

Sí, pensé en eso, pero hice un poco de investigación y encontré otra solución. – Igor

Cuestiones relacionadas