android 自定义simplecursoradapter,数据库更改时,Android SimpleCursorAdapter不会更新

数据库更改时,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值