Альтернативный фон для строк в ListFragment не работает при изменении размера строк

Я использую пользовательский ListFragment для отображения списка, в котором четные строки имеют фон, а нечетные - нет. Для этого я создал подкласс ArrayAdapter с переопределенным методом getView(int, View, ViewGroup) и установил фоновый ресурс для четных строк.

Это работало, но мне нужно было настроить размеры представлений, чтобы они были одинаковыми в строках с фоном и без него, поэтому я настроил параметры LayoutParams следующим образом:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    if ((position & 1) == 0) {
        view.setBackgroundResource(R.drawable.marcador_wink_normal);
    }
    ViewGroup.LayoutParams params = view.getLayoutParams();
    params.height = rowHeight;
    view.setLayoutParams(params);
    return view;
}

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

У меня вопрос: что я делаю не так?

Я использую библиотеку поддержки v4 для фрагментов, и это метод onCreate(Bundle) моего пользовательского ListFragment:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
            android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;

    setListAdapter(new WinkAdapter(getActivity(), layout, TEST_LIST));
}

2 ответа

Решение

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

В исходном коде, если фон задан как R.drawable.marcador_wink_normal для данного представления, это навсегда был R.drawable.marcador_wink_normal. Когда вы добавили else, вы сделали так, чтобы он правильно устанавливал фон в этих повторно используемых представлениях.

Хорошо, я решил это, просто добавив оператор else:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    if ((position & 1) == 0) {
        view.setBackgroundResource(R.drawable.marcador_wink_normal);
    }
    else {
        view.setBackgroundColor(0);
    }
    ViewGroup.LayoutParams params = view.getLayoutParams();
    params.height = 100;
    view.setLayoutParams(params);
    return view;
}

Но я до сих пор не понимаю, почему возникла проблема.

Другие вопросы по тегам