Не могу понять, почему цвет фона имеет неправильное поведение при прокрутке ListView - PullRequest
1 голос
/ 21 ноября 2011

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

  1. У меня есть ListView, заполненный пользовательским CursorAdapter.

  2. В методе bindView() я пытаюсь установить цвет ребенка.

  3. Этот дочерний элемент является LinearLayout, корневым макетом, используемым для элементов в списке. Он находится в файле XML R.layout.list_item, накачанном в методе newView() пользовательского CursorAdapter.

  4. Я установил цвет фона, используя код ниже.

    LinearLayout root = (LinearLayout) view.findViewById(R.id.list_item_root);
    // ...
    if (isEvenDay(cal)) {
        tvDate.setText(tvDate.getText() + " *");
        root.setBackgroundColor(Color.DKGRAY);
    }
    

Не беспокойтесь ни о чем , кроме setBackgroundColor в блоке if. Вот увидишь.

Ожидаемое поведение: некоторые дети будут окрашены DKGRAY и будут * добавлены к определенному textView. Другие будут цветом по умолчанию и не имеют этого *. Я использую этот тег * только для того, чтобы убедиться, что это (не напрямую) мой код.

Поведение: , когда ListView первоначально отображается, он выглядит нормально, как и ожидалось. Когда я прокручиваю список, он становится «странным» (я не понимаю), и некоторые дети начинают менять цвета, пока все дети не будут окрашены DKGRAY.

Теперь самое худшее, что это работает:

    LinearLayout root = (LinearLayout) view.findViewById(R.id.list_item_root);
    // ...
    if (isEvenDay(cal)) {
        tvDate.setText(tvDate.getText() + " *");
        root.setBackgroundColor(Color.DKGRAY);
    } else {
        root.setBackgroundColor(Color.GRAY);
    }

Надлежащие дети раскрашиваются DKGRAY и GREY, и прокрутка списка не заставит цвета списка сходить с ума. Цвета не меняются, и все кажется в порядке. За исключением, конечно, я не хочу DKGRAY и GREY, я хочу DKGRAY и оставить других детей в покое. ¬¬

Пожалуйста, помогите мне!


Изображения ниже. Посмотрите, как * в первом столбце отлично работает между разными датами, но цвет - нет.

1- Я начинаю прокручивать, и некоторые дети уже неисправны:

enter image description here

2- Я заканчиваю прокрутку вверх и вниз, и, наконец, все дети неисправны:

enter image description here

3- Но когда я установлю цвета для всех детей, прокрутка не облажается:

enter image description here

1 Ответ

2 голосов
/ 21 ноября 2011

Чтобы не создавать огромное количество представлений в памяти и не вызывать большого количества выделения и сбора мусора, bindView предоставит вам «переработанное» представление, которое уже использовалось при прокрутке большого списка. Это представление будет иметь все атрибуты, которые использовались в последний раз. Из-за этого вам нужно явно установить все эти атрибуты.

Итак, если иногда вы хотите, чтобы он был серым, а иногда - белым, вам необходимо всегда устанавливать один или другой. Не существует «значения по умолчанию», на которое вы можете положиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...