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

366
26 февраля 2017, 07:59

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

Answer 1

Для реализации чекбоксов в ListView есть три способа:

  1. Использовать стандартные возможности API - установить списку режим android:choiceMode="multipleChoice" (альтернативный код listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)) и в качестве айтема использовать предоставленную API разметку - android.R.layout.simple_list_item_multiple_choice.
    Данный вариант печалит аскетичностью оформления - строка текста и напротив чекбокс.

  2. Действовать по примеру первого варианта, но создать собственную разметку. Данная разметка должна обязательно реализовывать интерфейс Checkable. Пример.

  3. Создать кастомный адаптер, который будет хранить состояния (установлен или нет - например отдельный массив boolean или поле в модели для айтема) всех чекбоксов в списке. При изменении чекбокса записывать новое состояние в этот список, при создании айтемов в методе getView() принудительно устанавливать чекбоксам значения из данного списка.

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

Первые два способа как бы "трувэй". Для получения чекнутых айтемов используется метод ListView - getCheckedItemPositions() (getCheckedItemIds() как вариант), который возвращает массив SparseBooleanArray, содержащий номера позиций, которые были изменены. Позиция находится в key, ее текущее состояние в value. Пример1

Способ хорош тем, что вы получаете такие плюшки, как методы: isChecked(),setChecked(), которые можете применять к отдельным айтемам "снаружи", например в активити . Пример2 , а так же некоторые другие возможности, заложенные в стандартный API.

Третий способ - не "тру"-реализация, но гораздо проще и понятнее. Чтобы получить состояние чекнутости элементов просто добавляем в адаптер метод, который отдаст наше "хранилище" состояний чекбоксов, дальше вы уже можете использовать его по собственному усмотрению.
Способ хорош тем, что позволяет свободный вид айтема без заморочек с интерфейсом Checkable и свободный формат возвращаемых данных по чекнутым элементам. Пример3. Плата такова, что при этом любые дополнительные "возможности", которые в первом варианте реализует API, вам придется реализовать самостоятельно.

Answer 2

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

READ ALSO
Таблциа грузится очень медленно

Таблциа грузится очень медленно

Использую Primafaces DataTable c прокруткой paginationВсе сделал но вот беда грузит очень медленно

318
Подскажите как добавить в SearchView список?

Подскажите как добавить в SearchView список?

Подскажите как добавить в SearchView список?

358
Преобразование HTML в PDF с помощью PHP

Преобразование HTML в PDF с помощью PHP

Посоветуйте хорошую библиотеку, которая умеет парсить HTML в формат PDF средствами PHP и понимает русскоязычные шрифтыПерепробовал кучу всего,...

403
как переименовать домен в opensrver?

как переименовать домен в opensrver?

Есть домен в openserverКак его переименовать, чтобы сайт после моих действий начал работать?

340