При работе с ListView
очень важно всегда помнить, что представления - это представление , а адаптер - модель данных .
Это означает, что все ваше состояние должно быть в адаптере (модель данных), не в представлениях.
Из того, что я могу сказать о вашем коде, у вас есть представление, которое показывает состояние проверки, и это состояние находится в представлении , а не в адаптере . То есть, когда пользователь нажимает на этот элемент в списке, для представления, используемого для отображения его элемента, его внутреннее проверенное состояние изменяется на переключение того, что отображается пользователю.
Но поскольку представление не является моделью данных, это состояние, с которым вы здесь играете, является временным и фактически не связано с щелчком элемента адаптера.
Наиболее очевидная проблема, с которой это связано, связана с переработкой. Когда вы прокручиваете ListView
, когда элементы прокручиваются с конца, а новые появляются внизу, представления, используемые для отображения старых элементов, повторно используются для отображения новых. Это гораздо эффективнее, чем раздувать новую иерархию представления элемента каждый раз, когда отображается новый элемент.
Поскольку у вас есть ваше состояние в представлении, когда происходит такая переработка, это состояние в представлении случайным образом повторно связывается с каким-то новым элементом. Это может происходить во многих случаях, а не только с помощью прокрутки.
Решение состоит в том, чтобы поместить ваше состояние проверки в адаптер, и реализовать Adapter.getView()
, чтобы установить проверенное состояние представления на основе состояния, которое вы сейчас имеете в адаптере. Таким образом, всякий раз, когда представление перерабатывается (и getView()
вызывается для привязки к нему новой строки данных), вы обновляете его проверенное состояние, чтобы правильно следовать новым отображаемым данным.