数据库更改时,Android SimpleCursorAdapter不会更新
我有一个Android notifydatasetchanged(),该数据库由Cursor通过SimpleCursorAdapter支持。
单击项目后,将切换数据库中相应行中的标志字段,并且需要更新列表中的视图。
问题是,当更新后的视图退出屏幕并被回收时,旧值返回视图时会显示在视图上。 每当thr列表重新绘制(方向更改等)时,都会发生相同的情况。
我使用notifydatasetchanged()刷新游标适配器,但似乎无效。
我应该如何更新数据库,以便同时更新游标?
6个解决方案
90 votes
当您更改想要反映在swapCursor()中的数据库中的数据时(或CursorAdapter所填充的内容,例如ListView通过CursorAdapter),请在changeCursor()上致电Cursor。
Cursor类似于ODBC客户端游标-它保存查询结果表示的所有数据。 因此,除非您更改数据库中的数据,否则changeCursor()不会知道这些更改,除非您通过swapCursor()对其进行刷新。
更新:由于年龄较大,应删除整个问题和答案集,但这显然是不可能的。 任何寻求Android答案的人都应该牢记,Android是一个快速发展的目标,2009年以来的答案通常比更新的答案差。
当前解决方案是获取新的Cursor,并在CursorAdapter上使用changeCursor()或swapCursor()来影响数据更改。
CommonsWare answered 2020-07-27T11:43:30Z
38 votes
adapter.changeCursor(cursor)现在已弃用。 从文档中:
不建议使用此方法。 不要使用这个。 只需请求一个新的游标,您就可以异步执行此操作,并在新游标返回后更新列表视图。
获取新光标后,可以使用adapter.changeCursor(cursor)。 这应该更新视图。
rony l answered 2020-07-27T11:43:59Z
21 votes
如果使用加载程序和自动生成的游标,则可以调用:
getLoaderManager().restartLoader(0, null, this);
在您的活动中,只需更改数据库上的某些内容即可重新生成新的游标。不要忘记还要定义事件处理程序:
@Override
public Loader onCreateLoader(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);
}
siefca answered 2020-07-27T11:44:23Z
1 votes
我不清楚您是否将CursorAdapter的autoRequery属性设置为false。
适配器将检查autoRequery属性; 如果是false,则不会更改光标。
gjican answered 2020-07-27T11:44:48Z
0 votes
requery()已经被弃用,只需在CursorAdapter的子类中实现像这样的简单updateUI()方法,并在数据更新后调用它即可:
private void updateUI(){
swapCursor(dbHelper.getCursor());
notifyDataSetChanged();
}
Jaroslav answered 2020-07-27T11:45:08Z
0 votes
这很容易。
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 ...
Shwarz Andrei answered 2020-07-27T11:45:32Z