2013-05-29 2 views
0

В моем проекте используется SQLiteCursorLoader library from commonsguy для загрузки данных из базы данных в ListView. Среди этих данных - простое логическое (поскольку SQLite поддерживает булевы ... то есть число, которое только когда-либо равно 0 или 1), которое указывает состояние флажка. Если я изменяю состояние флажка в списке и затем прокручиваю элемент из списка, элемент списка возвращается к состоянию, которое он имеет при передаче курсора, несмотря на то, что базовая база данных изменилась. Если я изменю состояние кучки флажков, а затем активирует список MultiChoiceMode, все отображаемые элементы вернутся к состоянию, в котором они находились, когда первоначально был перенесен курсор, несмотря на то, что базовая база данных изменилась.Обновление курсора из SQLiteCursorLoader

Есть ли способ обновить курсор? Cursor.requery() устарел, и я не хочу создавать новый Cursor каждый раз, когда установлен флажок, что случается очень много. Я также не уверен в том, что вызов restartLoader() несколько раз будет работать, по производительности, тем более, что я использую onLoadFinish() для выполнения некоторых анимаций.

ответ

0

Есть ли способ обновить курсор?

Звоните restartLoader(), чтобы иметь возможность перезагрузить данные.

Я не хочу, чтобы создать новый курсор каждый раз, когда установлен флажок, который бывает много

Используется должным образом, ListView поддерживает проверенное состояние для вас. Вы сделали бы это через android:choiceMode="multipleChoice" и строку Views, которые реализуют Checkable. Цель состоит в том, чтобы не изменять базу данных до тех пор, пока пользователь не указал, что они выполняются с помощью контрольного списка одним или несколькими способами (например, элемент «Сохранить»).

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

Не называйте это несколько раз. В идеале назовите его нулевым временем, не обновляя базу данных до тех пор, пока пользователь не будет выполнен, и в этот момент вы, вероятно, перейдете к другой части вашего пользовательского интерфейса. Или вызовите его только один раз для каждого запрошенного ввода-вывода базы данных (например, в момент нажатия «Сохранить»). Или переключитесь с использования CursorAdapter на что-то еще, например ArrayAdapter на набор POJO, который вы заполняете из Cursor, так что представление в памяти может быть модифицировано в дополнение к тому, чтобы быть отдельно устойчивым.

+0

Хотя я признаю, что это хороший совет в целом, это совет, который не помогает мне в моих конкретных обстоятельствах. Мое приложение предназначено для банковской книги, и оно использует реляционную базу данных для отслеживания всех важных данных, в том числе, если пользователь проверил элемент, чтобы отметить транзакцию как опубликованную. В представлении списка есть атрибут 'android: choiceMode =" multipleChoiceModal ", поэтому пользователь может активировать« ActionMode », чтобы удалить сразу несколько элементов из базы данных. Вы можете просмотреть источник здесь, если хотите: https://bitbucket.org/MowDownJoe/vault-foss – MowDownJoe

+0

@MowDownJoe: «это не помогает мне в моих конкретных обстоятельствах» - тогда вам нужно будет изменить свое обстоятельство. Вам нужно либо запросить курсор, либо остановить использование CursorAdapter, нравится вам это или нет. – CommonsWare

Смежные вопросы