То, что @Bek предложил, является правильным решением. Вам нужно будет использовать OnClickListener. Также то, что вы прокомментировали, тоже не так, просто то, что вы использовали (ListView), есть или было!
Позвольте мне разобрать это для вас:
ListView : Старая версия RecyclerView.
Интересно, почему разработчик создал еще один избыточный компонент? В основном проблема с памятью! ListView создает столько ItemViews, сколько ему требуется, тогда как RecyclerView просто перерабатывает itemView.
Например, если для списка из 100 элементов, если мы используем ListView, он первоначально создаст столько ItemViews, сколько может отобразить телефон. Затем, когда мы прокручиваем вниз, он продолжает создавать больше видов до 100-го элемента (100 элементов в памяти). Но RecyclerView делает это более эффективно, он создает столько представлений, которые он может показать + 1 (следующий вид в списке), затем он продолжает их перерабатывать, поэтому у нас всегда есть только столько представлений на экране +1, а не 100, когда мы достигаем нижней части списка. ,Для более подробной информации прочитайте это и это .
OnCheckChangeListener : Другой источник проблем!
Этот слушатель вызывается всякий раз, когда проверяются изменения для флажка, Всякий раз ! Так что, если я обновлю флажок, этот слушатель (теоретически) будет вызван! Куда я иду с этим? Да, когда используется вместе с RecyclerView, это приведет к хаосу в коде. В тот момент, когда recyclerView уничтожает или повторно использует ItemView, флажок сбрасывается, что запускает слушателя и заставляет ваш SharedPref переписать проверку! Я проверил это, добавив журналы внутри слушателя и увидел, что он запускается для большинства внешних видов, когда он перерабатывается.
Это только мои выводы, возможно, есть какой-то способ или исправить это, ноя бы также предложил использовать OnClickListener и написать слушатель для изменения модели в основном классе, а не sharedPref в адаптере.
О! Вы можете использовать ViewHolder.SetIsRecyclable (false), это остановит RecyclerView от повторной обработки представлений и создаст столько представлений, сколько элементов в списке. Но я бы не советовал этого делать, так как пользовательский интерфейс, а также UX будут скомпрометированы, поскольку при прокрутке вы можете столкнуться с некоторой задержкой (проблема с памятью)!
Long Story Краткое использование OnClickListener с RecyclerView!