getView вызывается с неправильной позицией при быстрой прокрутке

довольно новый Android-разработчик.

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

У меня есть собственный listView, настроенный с использованием отдельного класса, который расширяет BaseAdapter и использует держатель представления (я настроил его, просматривая различные примеры пользовательских списков). У него есть текстовое представление, кнопка, индикатор выполнения и кнопка изображения, и эти элементы скрыты/изменены на основе AsyncTask, используемого для загрузки файла.

Все работает нормально, когда я медленно прокручиваю список. Когда я быстро прокручиваю список вверх/вниз, как будто представления некоторых ячеек в списке переназначаются другим ячейкам.

Я поместил эту строку в начало моего метода "getView" в моем классе адаптера:

    @Override
    public View getView(final int pos, View convertView, ViewGroup parent)
    {
        Log.i("ks3","getView called, position is " + pos);

У меня есть 7 элементов в моем списке, и 6 из них помещаются на экране. Когда он впервые отображается, я вижу это в своем журнале:

getView called, position is 0
getView called, position is 1
getView called, position is 2
getView called, position is 3
getView called, position is 4
getView called, position is 5

Когда я медленно прокручиваю вниз к следующему элементу, это распечатывается следующим образом:

getView called, position is 6

Когда я прокручиваю обратно вверх, это:

getView called, position is 0

Переход вниз и вверх медленно производить эти результаты безупречно.

Когда я начинаю быстро прокручивать вперед и назад, он выводит это сообщение несколько раз, в основном показывая 6 и 0 в качестве позиции, но иногда я также вижу это:

getView called, position is 1
getView called, position is 5

Позиции 1 и 5 не должны быть им звонят, так как они всегда на экране. Как будто getView все перепутал. В то же время, как я уже говорил, мой список будет выглядеть странно. Кнопки изображений будут перемещены вверх или вниз на ячейку, где их быть не должно.

Если я вернусь к плавной прокрутке, я снова увижу только 0 и 6 для позиции.

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

Спасибо!

Редактировать: Я хотел обновить пару вещей по этому вопросу. Во-первых, из комментария здесь и из видео Google на listView мне стало известно, что getView можно вызывать для других целей, а не для того, для чего я его себе представлял, например, для измерений, и поэтому мне не следует беспокоиться то, что я изначально считал частью моей проблемы (я думал, что getView вызывается с неправильными позициями).

Во-вторых, я несколько раз видел, что очень плохая идея «кэшировать представления внутри вашего адаптера». Я не совсем понимаю, что это значит, но я уверен, что это одна из вещей, которые я делаю неправильно (я сохраняю экземпляр кнопки, progressBar, imageButton...).

Это, наряду с тем фактом, что я обновляю представления вне getView и не использую notifyDataSetChanged(); они вместе, вероятно, вызывают некоторые странные вещи.

9
задан Droidmon 15 March 2012 в 18:45
поделиться