0

我的项目使用 commonsguy 的SQLiteCursorLoader 库将数据从数据库加载到 ListView 中。这些数据中有一个简单的布尔值(就 SQLite 支持布尔值而言......也就是说,一个永远是 0 或 1 的数字),它告诉复选框的状态。如果我更改列表中复选框的状态,然后将项目从列表中滚动出来,则列表项将返回到传入光标时的状态,尽管基础数据库已更改。如果我更改了一堆复选框的状态,然后激活列表的MultiChoiceMode,所有显示的项目将恢复到它们最初传入光标时的状态,尽管底层数据库已经更改。

有没有办法刷新光标?Cursor.requery()已弃用,我不想在Cursor每次选中复选框时都创建一个新的复选框,这种情况经常发生。我也不确定restartLoader()多次调用将如何工作,性能方面,特别是因为我曾经onLoadFinish()执行一些动画。

4

1 回答 1

0

有没有办法刷新光标?

调用restartLoader()让它重新加载数据。

我不想在每次选中复选框时都创建一个新的光标,这种情况经常发生

如果使用得当,aListView会为您保持选中状态。您可以通过android:choiceMode="multipleChoice"实现. 目标是在用户通过一种或另一种方式(例如,“保存”操作栏项目)表明他们已经完成对清单的干扰之前不修改数据库。ViewsCheckable

我也不确定多次调用 restartLoader() 会如何工作,性能方面,特别是因为我使用 onLoadFinish() 来执行一些动画。

不要多次调用它。理想情况下,将其称为零次,在用户完成之前不更新数据库,此时您可能正在转换到 UI 的其他部分。或者,每个请求的数据库 I/O 只调用一次(例如,在单击“保存”时)。或者,从使用 a 切换CursorAdapter到其他东西,例如ArrayAdapter您从 填充的一组 POJO 上的 a Cursor,这样内存中的表示除了可以单独持久化之外还可以修改。

于 2013-05-29T23:14:06.860 回答