我正在使用一个数据库,并且有一个使用游标适配器的列表 fragment ,我通过在加载程序中查询数据库来获得它。
当用户长按 ListView 项时,他会看到上下文菜单和删除该条目的选项。
当他按下 delete 键时,我启动了一个删除该条目的线程,然后再次启动加载程序以获取新游标(因为不推荐使用“requery()”)。
当加载程序完成加载新光标时,我尝试使用 changeCursor
方法来刷新 ListView ,但它没有这样做,所以我尝试使用 notifyDataSetChanged
但它也不起作用。
我已经检查过,光标从加载器返回,它确实改变了光标,但 ListView 没有刷新。
我该怎么办?重启 fragment ?
这是一些代码:
case MENU_REMOVE:
final AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
mProgress = ProgressDialog.show(getActivity(), getString(R.string.list_remove_progress_title_text),
getString(R.string.progress_dialog_description));
new Thread(new Runnable() {
@Override
public void run() {
PlacesHandler wph = new PlacesHandler(getActivity());
wph.DeleteEntry(mPlaceName, info.id);
getLoaderManager().initLoader(0, null, ListFragment.this);
}
}).start();
return(true);
加载完成时:
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if(mProgress == null || !mProgress.isShowing()){
...
}
else{
mProgress.dismiss();
mAdapter.changeCursor(data);
mAdapter.notifyDataSetChanged();
}
}
谢谢!
最佳答案
谢谢大家,但我发现了我的问题! 从加载程序返回的游标与适配器中的游标相同。 这是因为我调用了:
getLoaderManager().initLoader(0, null, this);
代替:
getLoaderManager().restartLoader(0, null, this);
因此,因为在创建 fragment 时第一次加载游标时,我已经使用了 ID 为 0 的加载程序,所以它立即将游标返回给我。
所以如果有人遇到同样的问题并阅读它,只知道 initLoader
使用一个现有的具有指定 ID 的加载器(如果有的话)。如果没有,它会创建一个。
但是如果你想丢弃加载器的旧数据并重新开始,你应该使用 restartLoader
。
再次感谢所有试图提供帮助的人!
关于android - 在其适配器上使用 changeCursor() 后,ListView 不会刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9268511/