Страница 1 из 1

Почему вызывается onCheckedChanged на onScroll?

Добавлено: 02 дек 2012, 12:30
Somebody
Есть listview. В каждый элемент списка грузится свой layout через implements SimpleAdapter.ViewBinder. В этом layout есть кастомный checkbox. На него вешаю свое событие checkView.setOnCheckedChangeListener(ListActivity.this); Как бы все нормально и работает на чеке на этот чекбокс.
Но! Когда начинаю скролить экран (туда-сюда), то почему-то система сама начинает вызывать событие onCheckedChanged, хотя я не нажимаю на чекбокс.
Почему идет такое поведение?

Re: Почему вызывается onCheckedChanged на onScroll?

Добавлено: 02 дек 2012, 14:18
AndreyI
При скролинге, те элементы, что не видны на экране могут уничтожаться, а когда появляются на свет божий заново создаются из разметки, его состояние берется из разметки, либо по умолчанию (false), а лишь затем пропускается через ваш биндер, где вы устанавливаете ему реальное значение из своего источника данных, т.е. значение чек-бокса меняется, вот и вызывается onCheckedChanged.

Re: Почему вызывается onCheckedChanged на onScroll?

Добавлено: 02 дек 2012, 19:26
Somebody
AndreyI писал(а):При скролинге, те элементы, что не видны на экране могут уничтожаться, а когда появляются на свет божий заново создаются из разметки, его состояние берется из разметки, либо по умолчанию (false), а лишь затем пропускается через ваш биндер, где вы устанавливаете ему реальное значение из своего источника данных, т.е. значение чек-бокса меняется, вот и вызывается onCheckedChanged.
Хорошо, возможно. Абсолютно не прозрачное поведение, но ладно. Как с этим бороться-то? Может надо использовать другое событие или какие-то есть доп. настройки у листа?

Re: Почему вызывается onCheckedChanged на onScroll?

Добавлено: 03 дек 2012, 03:10
AndreyI
А зачем с этим бороться? В случае вызова onCheckedChanged вы просто записываете в свой ArrayList (или что там у вас используется для хранения состояния чек-боксов) новое состояние, если это сделал пользователь, то состояние перезапишется на противоположное, в противном случае просто перезапишется тоже что и было, в любом случае результат будет корректен. Адаптеру главное знать откуда получать данные о состоянии чекбоксов когда он их пересоздает это вы и обеспечиваете биндером.

Re: Почему вызывается onCheckedChanged на onScroll?

Добавлено: 03 дек 2012, 10:20
Somebody
AndreyI писал(а):А зачем с этим бороться? В случае вызова onCheckedChanged вы просто записываете в свой ArrayList (или что там у вас используется для хранения состояния чек-боксов) новое состояние, если это сделал пользователь, то состояние перезапишется на противоположное, в противном случае просто перезапишется тоже что и было, в любом случае результат будет корректен. Адаптеру главное знать откуда получать данные о состоянии чекбоксов когда он их пересоздает это вы и обеспечиваете биндером.
В итоге понял в чем проблема. Надо использовать не это событие onCheckedChanged, а просто setOnClickListener и onClick и не будет никакого вызова на скроле.

Re: Почему вызывается onCheckedChanged на onScroll?

Добавлено: 03 дек 2012, 10:48
AndreyI
Можно и так.