3

我正在使用数据库,并且有一个列表片段,它使用游标适配器通过在加载器中查询数据库来获得。当用户长按列表视图项时,他会看到上下文菜单和删除此条目的选项。当他按下删除时,我正在启动一个删除此条目的线程,然后再次启动加载程序以获取新光标(因为不推荐使用“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();
        }
    }

谢谢!

4

4 回答 4

4

谢谢大家,但我发现了我的问题!从加载器返回的游标与适配器中的游标相同。这是因为我打电话给:

getLoaderManager().initLoader(0, null, this);

代替:

getLoaderManager().restartLoader(0, null, this);

所以因为我在创建片段时第一次加载游标时已经使用了 ID 为 0 的加载器,所以它只是立即返回了我的游标。因此,如果有些人遇到同样的问题并阅读它,只要知道它initLoader使用具有指定 ID 的现有加载器(如果有的话)。如果没有,它会创建一个。但是如果你想丢弃加载器的旧数据并重新开始,你应该使用restartLoader.

再次感谢任何试图提供帮助的人!

于 2012-02-14T20:53:48.573 回答
1

删除 SQLite 寄存器后,我只是这样做了:

myAdapter.getFilter().filter("");

于 2013-03-14T03:50:12.130 回答
0

几件事。我对碎片不熟悉,所以我会尽力帮助你。

您在哪里更新游标以获取新数据?另外,尝试使用 AsyncTask 进行删除。完成后,在 postexecute 方法中更新适配器。

于 2012-02-13T22:07:33.413 回答
0

我通过创建新的光标和新的适配器解决了类似的问题。然后将新适配器设置为列表视图: myListView.setAdapter(listViewAdapter);

这种方法的唯一问题是我的列表视图没有保持滚动位置。

于 2012-02-14T12:01:32.070 回答