在其适配器上使用changeCursor()后,ListView不会刷新

时间:2012-02-13 21:45:00

标签: android cursor android-listview android-fragments android-cursoradapter

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

答案 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);

这种方法的问题在于我的列表视图不会保持滚动位置。