数据库更改时,Android SimpleCursorAdapter不会更新
我有一个通过SimpleCursorAdapter
由数据库Cursor
支持的Android SimpleCursorAdapter
。
单击项目时,数据库的相应行中的标志字段将被切换,列表中的视图需要更新。
问题是,更新的视图在屏幕上显示并被回收时,旧的值在视图中显示时显示在视图中。 每当thr列表重新绘制(方向更改等)时,都会发生同样的情况。
我使用notifydatasetchanged()
刷新游标适配器,但它似乎无效。
我应该如何更新数据库,以便更新光标?
当您更改数据库中要反映在该Cursor
(或Cursor
填充的事物,如通过CursorAdapter
的ListView
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 …