Флажок 'Checked' в ListView восстанавливается после прокрутки - PullRequest
5 голосов
/ 04 апреля 2010

У меня следующая проблема:

У меня есть ListActivity, его ListView состоит из значка, текста и флажка (используя LayoutInflater).

Адаптер для ListView расширяет ResourceCursorAdapter (т. Е. Источник данных ListView извлекается из базы данных, а также проверяется состояние каждой строки)

Все работает довольно хорошо, за исключением случаев, когда я снимаю / проверяю флажок в любой строке, если я прокручиваю вниз, пока измененный флажок больше не отображается, а затем прокручиваю вверх, флажок восстанавливается в исходное состояние.

База данных изменена, это не проблема (то есть, если я изменю строку, выйду из операции и снова введу, измененная строка будет отображаться в порядке).

Я предполагаю, что это как-то связано с отображением списка, потому что по какой-то причине ListView "отображает" исходное состояние всех строк, когда он был впервые заполнен при прокрутке.

Я искал эту ошибку, но я не нашел никого, кто имел эту проблему. Я ценю любой ваш совет.

Ответы [ 3 ]

2 голосов
/ 10 августа 2010

Эта ссылка дает представление о вашей проблеме

Элементы EditText в списке прокрутки теряют свои изменения при прокрутке с экрана

Строки списка перерабатываются. Ваш курсор может иметь 1000 записей, но есть не будет 1000 EditText виджеты, созданные при прокрутке список. Скорее будет 10 или так, в зависимости от того, сколько строк одновременно видимый. Ряды получают переработано, и операция связывания заменит старое значение EditText с новым значением из курсора для любой ряд просто прокручивается на экран, заменяя все, что там было до (предыдущее значение из база данных или пользовательское значение).

1 голос
/ 17 августа 2010

Проблема была решена путем закрытия соответствующего курсора после изменения базы данных и повторного открытия его с помощью changeCursor ().

1 голос
/ 04 апреля 2010

Когда элемент появится в поле зрения, будет вызван ваш метод ListAdapter.getView ().

Это может произойти несколько раз за сеанс, если, например, вы прокручиваете элемент за пределами экрана и затем снова включаете.

Я бы посоветовал вам поставить точку останова на getView () и запустить приложение с помощью отладчика.Повторите ваш тест, и в случае, если getView () будет вызван во второй раз, проверьте логику, в которой установлен ваш флажок.

Еще одним соображением является то, что вторым параметром getView является представление 'convertView'.Это один из ваших собственных видов из других записей списка, который больше не отображается.ОС возвращает вам это представление, чтобы у вас была возможность «перезапустить» представление для создания новой записи, вместо того, чтобы надувать новое, что повлияет на производительность.

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

Если вы решите использовать этот параметр для попытки перезапуска представления, проверьте свою логику и убедитесь, что вы устанавливаете все элементы управления в желаемое состояние, так как состояние макета по умолчанию может не применяться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...