数据库更改时,Android SimpleCursorAdapter不会更新

我有一个通过SimpleCursorAdapter由数据库Cursor支持的Android SimpleCursorAdapter

单击项目时,数据库的相应行中的标志字段将被切换,列表中的视图需要更新。

问题是,更新的视图在屏幕上显示并被回收时,旧的值在视图中显示时显示在视图中。 每当thr列表重新绘制(方向更改等)时,都会发生同样的情况。

我使用notifydatasetchanged()刷新游标适配器,但它似乎无效。

我应该如何更新数据库,以便更新光标?

当您更改数据库中要反映在该Cursor (或Cursor填充的事物,如通过CursorAdapterListView requery() ,请在Cursor上调用requery() )。

Cursor类似于ODBC客户端游标 – 它保存查询结果表示的所有数据。 因此,仅仅因为你改变了数据库中的数据, Cursor就不会知道这些改变,除非你通过requery()刷新它。


更新 :这个整个问题和答案应该删除由于年老,但这显然是不可能的。 任何寻求Android解决scheme的人都应该记住,Android是一个迅速移动的目标,2009年的答案通常比新的答案更糟糕。

目前的解决scheme是获取新的Cursor并使用CursorAdapter上的changeCursor()swapCursor()来影响数据更改。

requery现已被弃用。 从文档 :

此方法已弃用。 不要使用这个。 只需要请求一个新的游标,这样你就可以asynchronous执行这个操作,并在新的游标返回时更新你的列表视图。

获得一个新的游标后,可以使用adapter.changeCursor(cursor) 。 这应该更新视图。

在使用加载器和自动生成的光标的情况下,您可以调用:

 getLoaderManager().restartLoader(0, null, this); 

在你的活动中,改变数据库上的东西后,重新生成新的游标。 不要忘记还要定义事件处理程序:

 @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { CursorLoader cursorLoader = new CursorLoader(this, YOUR_URI, YOUR_PROJECTION, null, null, null); return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { adapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { adapter.swapCursor(null); } 

如果将CursorAdapter的autoRequery属性设置为true我不清楚。

适配器将检查autoRequery属性; 如果它是false ,那么光标不会被改变。

requery()已经被弃用,只需在CursorAdapter的子类中实现像这样的简单的updateUI()方法,并在数据更新后调用它:

 private void updateUI(){ swapCursor(dbHelper.getCursor()); notifyDataSetChanged(); } 

这很容易。

 private Db mDbAdapter; private Cursor mCursor; private SimpleCursorAdapter mCursorAd; ..................................... //After removing the item from the DB, use this ..................................... mCursor = mDbAdapter.getAllItems(); mCursorAd.swapCursor(mCursor); 

或者使用CursorLoader …

Interesting Posts