我正在使用数据库,并且有一个列表片段,它使用游标适配器来查询加载器中的数据库。
当用户长按列表视图项时,他会看到上下文菜单和删除此条目的选项。
当他按下删除时,我启动一个删除此条目的线程,然后再次启动加载器以获取新游标(因为不推荐使用“requery()”)。
当加载程序完成加载新游标时,我正在尝试使用changeCursor
方法来假设刷新列表视图但是它没有这样做,所以我尝试使用notifyDataSetChanged
但它没有也工作。
我已检查并且光标从加载器返回,它确实更改了光标但列表视图没有刷新。
我该怎么办?重启片段?
以下是一些代码:
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();
}
}
谢谢!
答案 0 :(得分:4)
谢谢大家,但我发现了我的问题! 从加载器返回的游标与适配器中的游标相同。 这是因为我打电话:
getLoaderManager().initLoader(0, null, this);
而不是:
getLoaderManager().restartLoader(0, null, this);
因为当我在创建片段时第一次加载光标时,我已经使用了ID为0的加载器,它只是立即将光标返回给我。
因此,如果某些人遇到同样的问题并阅读它,只需知道initLoader
使用具有指定ID的现有加载器(如果有)。如果没有,它会创建一个。
但是如果你想丢弃加载器的旧数据并重新开始,你应该使用restartLoader
。
再次感谢任何试图提供帮助的人!
答案 1 :(得分:1)
删除SQLite寄存器后,我只是这样做了:
myAdapter.getFilter()过滤器( “”);
答案 2 :(得分:0)
一些事情。我不熟悉片段,所以我会尽力帮助你。
您在哪里更新光标以获取新数据?另外,尝试使用AsyncTask进行删除。完成后,使用postexecute方法更新适配器。
答案 3 :(得分:0)
我通过创建新的curson和新适配器解决了类似的问题。然后将新适配器设置为列表视图:
myListView.setAdapter(listViewAdapter);
这种方法的问题在于我的列表视图不会保持滚动位置。