我有一个Android ListActivity
是由数据库支持Cursor
通过SimpleCursorAdapter
.
单击项目时,将切换数据库中相应行中的标志字段,并且需要更新列表中的视图.
问题是,当更新的视图离开屏幕并被回收时,旧视图返回到视图时会显示在视图上.每当thr list重绘时(方向更改等),都会发生同样的事情.
我notifydatasetchanged()
用来刷新光标适配器,但似乎无效.
我应该如何更新数据库以便更新游标?
打电话requery()
的Cursor
,当你更改了要反映在数据库中的数据Cursor
(或事物的Cursor
填充,如ListView
通过CursorAdapter
).
A Cursor
类似于ODBC客户端游标 - 它包含查询结果表示的所有数据.因此,仅仅因为您更改了数据库中的数据,Cursor
除非您通过它刷新,否则不会知道这些更改requery()
.
更新:由于年龄的原因,应该删除整个问题和一组答案,但这显然是不可能的.任何寻求Android答案的人都应该记住,Android是一个快速移动的目标,而2009年的答案通常比新答案更糟糕.
目前的解决方案是,以获得新鲜的Cursor
,并使用任一changeCursor()
或swapCursor()
上CursorAdapter
以影响数据的变化.
requery
现已弃用.从文件:
不推荐使用此方法.不要使用它.只需请求一个新光标,这样你就可以异步执行此操作,并在新光标返回后更新列表视图.
获得新游标后,可以使用adapter.changeCursor(cursor)
.这应该更新视图.
如果使用加载器和自动生成的游标,您可以调用:
getLoaderManager().restartLoader(0, null, this);
在您的活动中,在更改DB上的内容之后,重新生成新游标.不要忘记定义事件处理程序:
@Override public LoaderonCreateLoader(int id, Bundle args) { CursorLoader cursorLoader = new CursorLoader(this, YOUR_URI, YOUR_PROJECTION, null, null, null); return cursorLoader; } @Override public void onLoadFinished(Loader loader, Cursor data) { adapter.swapCursor(data); } @Override public void onLoaderReset(Loader loader) { adapter.swapCursor(null); }