Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

При скроллинге пропадают отметки чекбоксов в айтемах ListView

#java #android #listview


В ListView элементов больше чем влезает на экран. Каждый элемент ListView имеет Checkbox.
При прокрутке со скрытых элементов снимается статус checked.
 Что сделать чтоб все сохранялось?
    


Ответы

Ответ 1



Для реализации чекбоксов в ListView есть три способа: Использовать стандартные возможности API - установить списку режим android:choiceMode="multipleChoice" (альтернативный код listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)) и в качестве айтема использовать предоставленную API разметку - android.R.layout.simple_list_item_multiple_choice. Данный вариант печалит аскетичностью оформления - строка текста и напротив чекбокс. Действовать по примеру первого варианта, но создать собственную разметку. Данная разметка должна обязательно реализовывать интерфейс Checkable. Пример. Создать кастомный адаптер, который будет хранить состояния (установлен или нет - например отдельный массив boolean или поле в модели для айтема) всех чекбоксов в списке. При изменении чекбокса записывать новое состояние в этот список, при создании айтемов в методе getView() принудительно устанавливать чекбоксам значения из данного списка. Помимо различий в реализации, данные способы различаются и способами получения значений чекбоксов (а ведь именно для этого все и затевалось). Первые два способа как бы "трувэй". Для получения чекнутых айтемов используется метод ListView - getCheckedItemPositions() (getCheckedItemIds() как вариант), который возвращает массив SparseBooleanArray, содержащий номера позиций, которые были изменены. Позиция находится в key, ее текущее состояние в value. Пример1 Способ хорош тем, что вы получаете такие плюшки, как методы: isChecked(),setChecked(), которые можете применять к отдельным айтемам "снаружи", например в активити . Пример2 , а так же некоторые другие возможности, заложенные в стандартный API. Третий способ - не "тру"-реализация, но гораздо проще и понятнее. Чтобы получить состояние чекнутости элементов просто добавляем в адаптер метод, который отдаст наше "хранилище" состояний чекбоксов, дальше вы уже можете использовать его по собственному усмотрению. Способ хорош тем, что позволяет свободный вид айтема без заморочек с интерфейсом Checkable и свободный формат возвращаемых данных по чекнутым элементам. Пример3. Плата такова, что при этом любые дополнительные "возможности", которые в первом варианте реализует API, вам придется реализовать самостоятельно.

Ответ 2



Этот вопрос уже 1000 раз задавался. Нужно в getView() устанавливать состояние елемента. Это описано в любом мануале по ListView.

Комментариев нет:

Отправить комментарий