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