Custom ArrayAdapter setBackground в getView

Я работаю над ListActivity, который отображает кучу чисел (весов). Я хотел бы изменить фон определенной строки в ListView. Для этого я создал пользовательскую реализацию класса ArrayAdapter и переопределил метод getView. Адаптер принимает список номеров и устанавливает фон строки с номером 20 в желтый (для простоты).

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, которые необходимо изменить.

Спасибо за вашу помощь!

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

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

 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 метод getView (основанный на getViewItemType и getViewTypeCount ).

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

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