如何刷新ListView以重新查询其游标并重新填充数据和视图

8

我有一个ListView,使用CursorAdapter作为它的适配器。 我想让ListView:

  • 重新查询数据
  • 在重新查询完成后刷新视图。

我尝试了以下代码:

CursorAdapter adapter = (CursorAdapter)listView.getAdapter();
adapter.notifyDataSetChanged();

我尝试了:

CursorAdapter adapter = (CursorAdapter)listView.getAdapter();
adapter.getCursor().requery();

但是没有任何一个方法起作用。我在ContentProvider的查询方法中设置了断点,但是我没有看到requery被调用或者我的ListView被刷新了新数据。
请问您能告诉我解决问题的方法吗?
谢谢。
4个回答

16

在使用CursorAdapterCursor附加到ListView上后,对数据库或内容提供程序的Cursor调用requery()会自动刷新列表(如上所述的第二种情况)。 您可以查看这里这里的示例。如果这对您不起作用,则可能存在ContentProvider或适配器中的一些错误。


它能工作,但性能如何呢?Requery很容易使用,但我不知道它是否好。 - emeraldhieu
9
requery现在已被标记为弃用,并且在SDK中还附有一小段注释。现在最好的方法是什么?是否仍然可以使用requery? - marchinram
1
Android SDK建议仅请求新游标,但如何在此后更新ListView? - Ran
2
@Ran:在你的CursorAdapter上使用changeCursor()swapCursor()方法。 - CommonsWare
1
我成功运行的唯一序列是adapter.notifyDataSetChanged,接着是adapter.getCursor().requery()。adapter.swapCursor(adapter.getCursor())和changeCursor都没有起作用。这个API显然缺少一个简单的refresh()方法,可以在不问任何问题的情况下重建ListView。 - carl
即使在2017年,这个问题仍未得到解决。仍然没有一种一致的方法来刷新适配器中的数据。 - user6694745

11

在新的API中(使用装载器管理器),您可以使用:

getLoaderManager().getLoader(_YOUR_LOADER_ID_).forceLoad();

4
一种选项是使用getLoaderManager().restartLoader()。 - Anderson
1
@Anderson,使用restartLoader时需要再次提供参数和回调函数,而getLoader仅基于ID。 - TWiStErRob

5
你可以尝试使用以下代码:adapter.changeCursor(new cursor)。这对我有效。

也适用于我。这里向我的程序员同行提出一个注意事项:changCursor()需要在UI线程中调用。当调用来自后台线程时,我遇到了崩溃问题。 - Cullen SUN

4

我知道这个答案可能已经太晚了,但是对于其他人来说,如果您正在使用游标加载器(正如您应该做的那样),只需执行以下操作

getContext().getContentResolver().notifyChange(uri, null);

其中uri是用于游标加载器的相同uri。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接