Пользовательский ArrayAdapter setBackground в getView - PullRequest
5 голосов
/ 24 октября 2010

Я работаю над 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.

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

Ответы [ 3 ]

3 голосов
/ 26 октября 2010

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

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

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 голос
/ 24 октября 2010

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

1 голос
/ 24 октября 2010

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

...