我有一个ListActivity
由数据库支持的 Android,它Cursor
通过SimpleCursorAdapter
.
单击项目时,数据库中相应行中的标志字段被切换,列表中的视图需要更新。
问题是,当更新的视图离开屏幕并被回收时,当它返回视图时,旧值会显示在视图上。每当重绘 thr 列表(方向更改等)时,都会发生同样的事情。
我notifydatasetchanged()
用来刷新游标适配器,但似乎无效。
我应该如何更新数据库以便也更新游标?
我有一个ListActivity
由数据库支持的 Android,它Cursor
通过SimpleCursorAdapter
.
单击项目时,数据库中相应行中的标志字段被切换,列表中的视图需要更新。
问题是,当更新的视图离开屏幕并被回收时,当它返回视图时,旧值会显示在视图上。每当重绘 thr 列表(方向更改等)时,都会发生同样的事情。
我notifydatasetchanged()
用来刷新游标适配器,但似乎无效。
我应该如何更新数据库以便也更新游标?
当您更改要反映在数据库中的数据requery()
(或填充的内容,例如通过 a )时,请调用。Cursor
Cursor
Cursor
ListView
CursorAdapter
ACursor
类似于 ODBC 客户端游标——它包含查询结果表示的所有数据。因此,仅仅因为您更改了数据库中的数据,Cursor
除非您通过requery()
.
更新:由于年老,应该删除整个问题和答案集,但这显然是不可能的。任何寻求 Android 答案的人都应该记住,Android 是一个快速移动的目标,2009 年的答案通常比新的答案更糟糕。
当前的解决方案是获取一个新的Cursor
并使用其中一个changeCursor()
或swapCursor()
上一个CursorAdapter
来影响数据更改。
requery
现在已弃用。从文档:
此方法已弃用。不要使用这个。只需请求一个新游标,这样您就可以异步执行此操作,并在新游标返回后更新您的列表视图。
获得新光标后,可以使用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);
}
我不清楚您是否将autoRequery
CursorAdapter 的属性设置为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...