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

Интерфейс, диалоги, темы, стили, меню
Ответить
Somebody
Сообщения: 9
Зарегистрирован: 02 дек 2012, 12:19

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

Сообщение Somebody » 02 дек 2012, 12:30

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

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

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

Сообщение AndreyI » 02 дек 2012, 14:18

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

Somebody
Сообщения: 9
Зарегистрирован: 02 дек 2012, 12:19

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

Сообщение Somebody » 02 дек 2012, 19:26

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

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

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

Сообщение AndreyI » 03 дек 2012, 03:10

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

Somebody
Сообщения: 9
Зарегистрирован: 02 дек 2012, 12:19

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

Сообщение Somebody » 03 дек 2012, 10:20

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

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

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

Сообщение AndreyI » 03 дек 2012, 10:48

Можно и так.

Ответить