【问题标题】:listview not refresh even after calling restart loader即使在调用重新启动加载程序后,listview 也不会刷新
【发布时间】:2012-12-06 06:04:18
【问题描述】:

长按列表项时,我有带有上下文菜单的列表片段。单击列表项并从我的数据库中删除列表项。但是调用restart loader后列表也不刷新?

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setEmptyText("Loading...");

        myAdapter = new MySimpleCursorAdapter(getActivity().getApplicationContext(), R.layout.my_list_item, null,  new String[] {DBConstants.NAME,DBConstants.ITEM1,DBConstants.SYMBOL}, new int[] {R.id.my_companyname,R.id.my_item1,R.id.my_symbol},0);
        setListAdapter(myAdapter);
        registerForContextMenu(getListView());
        MyLoader = getActivity().getSupportLoaderManager().initLoader(1, null, this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        DBHelper dbHelper=new DBHelper(getActivity());
        return new MyLoader(getActivity(),dbHelper);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> arg0, Cursor c) {
        if(c!=null && c.getCount()>0){
            myAdapter.swapCursor(c);
            if (isResumed()) {
                setListShown(true);
            } else {
                setListShownNoAnimation(true);
            }
        }
        else
        {
            setEmptyText("Not selected");
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> arg0) {
        myAdapter.swapCursor(null);
    }

@Override
    public boolean onContextItemSelected(MenuItem item) {
        String selectedItem = item.getTitle().toString();
        Log.i("context", "selected context menu item->"+selectedItem);

        if(selectedItem.equalsIgnoreCase("Remove"))
        {
            AdapterView.AdapterContextMenuInfo menuInfo=(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
            String[] args={String.valueOf(menuInfo.id)};
            Log.i("context", String.valueOf(menuInfo.id));
            new DBHelper(getActivity()).getWritableDatabase().delete(DBConstants.MYSTOCKS_TABLE, "_ID=?", args);

            getActivity().getSupportLoaderManager().restartLoader(1, null, this);

            /*
             Cursor cursor = myAdapter.getCursor();
            myAdapter.swapCursor(cursor);
            */
            //getLoaderManager().initLoader(0, null, this);
        }
        return super.onContextItemSelected(item);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
        //super.onCreateContextMenu(menu, v, menuInfo);
        getActivity().getMenuInflater().inflate(R.menu.mystocks_context, menu);

    }

【问题讨论】:

  • 你测试onLoadFinished重启Loader后是否收到一些有效数据?
  • 我删除了 onLoadFinished 中的 if(c!=null && c.getCount()>0)-if else 语句。现在它交换光标和刷新列表。但是现在我在 onActivityCreated 中初始化了加载器,它有时调用 onLoadFinished 而不调用 onCreateLoader。
  • onLoadFinished 不能在没有 onCreateLoader 之前被调用的情况下被调用。是否有任何理由调用getActivity().getLoaderManager()... 并存储Loader?只需致电getSupportLoaderManager().initLoader(1, null, this);
  • 实际上我有标签及其内容作为片段。每当我在 tab1 内容中添加一个项目时,它都会反映在 tab2 内容上。在第一次创建活动时,如果在Tab1中选择一个项目,它会反映在tab2中。但是下次我移动到 tab1 并选择另一个项目时,它不会反映在 Tab2 上(因为在 onActivitycreated 中初始化了加载器。现在我只替换了片段)。我试图在 onCreate 中初始化加载器,但它说 Content View not created still.i已完成加载中的交换光标适配器。
  • 如果没有看到有关如何操作这些片段的代码,我会说在 tab2 片段中有一个布尔字段,这应该表明需要重新启动加载程序(在 onResume 方法中)并更新它每当您更改其数据时,tab1 片段中的字段。

标签: android android-listfragment android-loadermanager


【解决方案1】:

您是在活动的 onCreate 还是 onResume 中添加片段?如果是后者,您可能希望将片段设置(事务创建、添加片段、提交)移动到 onCreate。完成后restartLoader() 将正常工作。

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多