довольно новый 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(); они вместе, вероятно, вызывают некоторые странные вещи.