#android #listview
Почему ListView повторяет позиции?
Например: я закрашиваю звезду на 4-й позиции и когда она исчезает после листания
верх то снизу выходит другой item с позицией 10, но закрашенной почему-то .... а я
не закрашивал 10-й item , я красил 4-й item ....
Ответы
Ответ 1
При создании нового айтема (view) списка адаптер для ускорения работы использует уже созданную ранее разметку для айтема, который вышел из зоны видимости экрана. Принцип таков, что Вам нужно в адаптер при заполнении каждого айтема передавать так же информацию о том, какой айтем был закрашен, а какой нет. Если элементы айтема (у Вас это звезды) это чекбоксы - то вам нужно сохранять информацию о том в каком айтеме был нажат чекбокс. Стоит посмотреть в сторону OnCheckedChangeListener. Если Ваши звезды это виджеты не являющийся чекбоксами, то нужно информацию о покрашеном айтеме сохранить, например в каком-то массиве, или SharedPreferences или БД. Потом при листании вытаскивать сохраненную информацию об айтеме который должен появиться в зоне видимости и передавать в адаптер информацию о том закрашен или нет этот элемент. Как вариант можете посмотреть мой пример заливки цветом айтемомов списка. Там я хранил информацию в БД, заливал ListView с помощью SimpleCursorAdapter, а его переопределенный SimpleCursorAdapter.ViewBinder использовал для изменения шрифта и цвета айтема при клике на view. В `ListView` при скролинге не получается сохранить измененные шрифт и заливку цветом элементов спискаОтвет 2
Просто запомните. Программная установка чего-либо должна выполняться как-будто айтем не тронутый. Другими словами вам надо обрабатывать оба случая Например, вместо if(favorite){ star.setVisibility(View.VISIBLE); } Надо писать if(favorite){ star.setVisibility(View.VISIBLE): } else{ star.setVisibility(View.GONE); } Это должно у вас просто запомниться. И, кстати, переходите на RecyclerView
Комментариев нет:
Отправить комментарий