Есть listview. В каждый элемент списка грузится свой layout через implements SimpleAdapter.ViewBinder. В этом layout есть кастомный checkbox. На него вешаю свое событие checkView.setOnCheckedChangeListener(ListActivity.this); Как бы все нормально и работает на чеке на этот чекбокс.
Но! Когда начинаю скролить экран (туда-сюда), то почему-то система сама начинает вызывать событие onCheckedChanged, хотя я не нажимаю на чекбокс.
Почему идет такое поведение?
Почему вызывается onCheckedChanged на onScroll?
Re: Почему вызывается onCheckedChanged на onScroll?
При скролинге, те элементы, что не видны на экране могут уничтожаться, а когда появляются на свет божий заново создаются из разметки, его состояние берется из разметки, либо по умолчанию (false), а лишь затем пропускается через ваш биндер, где вы устанавливаете ему реальное значение из своего источника данных, т.е. значение чек-бокса меняется, вот и вызывается onCheckedChanged.
Re: Почему вызывается onCheckedChanged на onScroll?
Хорошо, возможно. Абсолютно не прозрачное поведение, но ладно. Как с этим бороться-то? Может надо использовать другое событие или какие-то есть доп. настройки у листа?AndreyI писал(а):При скролинге, те элементы, что не видны на экране могут уничтожаться, а когда появляются на свет божий заново создаются из разметки, его состояние берется из разметки, либо по умолчанию (false), а лишь затем пропускается через ваш биндер, где вы устанавливаете ему реальное значение из своего источника данных, т.е. значение чек-бокса меняется, вот и вызывается onCheckedChanged.
Re: Почему вызывается onCheckedChanged на onScroll?
А зачем с этим бороться? В случае вызова onCheckedChanged вы просто записываете в свой ArrayList (или что там у вас используется для хранения состояния чек-боксов) новое состояние, если это сделал пользователь, то состояние перезапишется на противоположное, в противном случае просто перезапишется тоже что и было, в любом случае результат будет корректен. Адаптеру главное знать откуда получать данные о состоянии чекбоксов когда он их пересоздает это вы и обеспечиваете биндером.
Re: Почему вызывается onCheckedChanged на onScroll?
В итоге понял в чем проблема. Надо использовать не это событие onCheckedChanged, а просто setOnClickListener и onClick и не будет никакого вызова на скроле.AndreyI писал(а):А зачем с этим бороться? В случае вызова onCheckedChanged вы просто записываете в свой ArrayList (или что там у вас используется для хранения состояния чек-боксов) новое состояние, если это сделал пользователь, то состояние перезапишется на противоположное, в противном случае просто перезапишется тоже что и было, в любом случае результат будет корректен. Адаптеру главное знать откуда получать данные о состоянии чекбоксов когда он их пересоздает это вы и обеспечиваете биндером.
Re: Почему вызывается onCheckedChanged на onScroll?
Можно и так.