Динамическое изменение макета строки списка влияет и на другие строки.

Я использую ListView, и в каждом элементе списка есть несколько кнопок.

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

например, когда я нажимаю кнопку 1-го элемента, это также влияет на кнопки в 6-м, 11-м, 16-м элементах. также кнопка 7-го элемента влияет на 2-й, 12-й, 17-й элементы.

причина в том, что адаптер не создает элемент списка для всех элементов данных. он создает только несколько объектов, достаточных для отображения на экране. как показано на рисунке при переходе вниз по списку верхний элемент становится последним и его значения меняются. поэтому, когда я скрываю кнопку в первом элементе, кнопка в 8-м элементе (цифры на картинке) тоже скрывается.

введите здесь описание изображения

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

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


person eluleci    schedule 01.02.2013    source источник


Ответы (2)


Вы должны следить за состоянием кнопок каждого элемента, отображаемым или скрытым. в методе getView() адаптера проверьте текущее состояние элемента, затем скройте или отобразите кнопку соответственно. при использовании этого метода обязательно установите состояние каждой кнопки, а не только то, которое должно быть скрыто, поэтому при повторном использовании представления представление получает новое состояние элемента, а не старое.

person Amal    schedule 01.02.2013
comment
на самом деле я не только прячу кнопку. я также добавляю новые кнопки и добавляю новое меню голосования в эту строку. поэтому другие строки также имеют это меню голосования. кажется, я буду обрабатывать статус каждой строки и снова и снова устанавливать их вид. - person eluleci; 01.02.2013

У Амаль есть часть вашего ответа. Когда ваш адаптер получает вызов getview, полностью повторно инициализируйте повторно используемое представление.

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

person Nathan    schedule 01.02.2013
comment
попробую без тредов. если это станет очень медленным, я попытаюсь использовать потоки. Спасибо - person eluleci; 01.02.2013