2010-10-24 4 views
5

Я работаю над ListActivity, который отображает кучу чисел (весов). Я хотел бы изменить фон определенной строки в ListView. Для этого я создал пользовательскую реализацию класса ArrayAdapter и переопределил метод getView. Адаптер принимает список номеров и устанавливает фон строки с номером 20 в желтый (для простоты).Custom ArrayAdapter setBackground в 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; 
    } 

} 

Проблема заключается в том, что не только строка с номером 20 получает желтый фон, но и строку с номером 0 (первая строка, которая является), и я не знаю, почему это так.

Я делаю что-то неправильно в методе getView (например, вызывая метод super)? Мое рассуждение о реализации: все возвращенные представления должны быть одинаковыми (вот почему я называю супер-метод) только представление, соответствующее критериям if, которые необходимо изменить.

Благодарим за помощь!

ответ

3

Я провел несколько исследований, чтобы выяснить, как это должно быть сделано правильно.

Я пишу это для других с той же проблемой, как я думаю, это правильный способ, как это сделать. Пожалуйста, дайте мне знать, если я ошибаюсь, или если у этого решения есть недостатки, которые я не вижу.

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; 

    } 
} 

Видимо базовый класс уже реализует логику, обеспечивающую правильный convertView передается getView метод (на основе getViewItemType и getViewTypeCount методы).

1

Взгляд Android - это повторное использование компонента для каждой строки. У меня тоже есть эта проблема.

+0

Я вижу. Это будет иметь смысл, да. Итак, теперь вопрос заключается в том, что это лучший способ решить эту проблему. Отбрасывание convertView или установка атрибутов стиля для обоих, если в конце концов, параметры? – Igor

1

Если это связано с повторным использованием, почему бы вам не добавить еще одну проверку, если itemWeight не равен 20? Если не равный, установите нормальный фон.

+0

Да, я подумал об этом, но я немного поработал и нашел другое решение. – Igor

Смежные вопросы