如何在notifyChange </cursor>之后更改Loader <cursor>中的查询

时间:2013-07-19 22:48:56

标签: android cursor loader

我已经尝试了几个小时但却无法做到这一点。我尝试通过Bundle,通过静态变量,通过if语句发送,但没有任何工作。

我有一种情况,我希望我的Loader在用户点击菜单项后加载不同的数据集。这意味着一旦收到notifyChange,就应该更改查询。代码是非常标准的Loader代码,如下所示:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String query = args.getString("query");

    String[] projection = { DbCreate.ID, DbCreate.COL_ITEM, DbCreate.COL_STATUS, DbCreate.COL_SYNCED,
            DbCreate.COL_PRIORITY, DbCreate.COL_COMPLETEBY, DbCreate.COL_TAG, DbCreate.COL_ASSIGNED, DbCreate.COL_SHARED};

    CursorLoader cursorLoader = new CursorLoader(getActivity(),
            DbProvider.CONTENT_URI_DATA, projection, query, null, "priority DESC, status ASC, _id DESC");

    return cursorLoader;
}

我在这个onCreate方法中也尝试过通常的if(...)语句,但它不起作用。这意味着notifyChange只触发已创建的对象。那么如何在notifyChange上注入新的“查询”值?

2 个答案:

答案 0 :(得分:8)

我在我的代码中做同样的事情你需要重新启动游标加载器当你想要更改数据通知工作在适配器而不是游标加载器

@Override
    public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
        // This is called when a new Loader needs to be created. 
        // Now create and return a CursorLoader that will take care of
        // creating a Cursor for the data being displayed.
        Uri contentUri = MyContentProvider.CONTENT_URI_FACEBOOK;
        switch (id) {
        case FACEBOOK:
            contentUri = MyContentProvider.CONTENT_URI_FACEBOOK;
            break;
        case LINKEDIN:
            contentUri = MyContentProvider.CONTENT_URI_LINKEDIN;
            break;
        }

        return new CursorLoader(getActivity(), contentUri, null, null, null,
                null);

    }

我正在做的各种查询

getLoaderManager().restartLoader(FACEBOOK, null, Profile.this);
getLoaderManager().restartLoader(LINKEDIN, null, Profile.this);

因此您只需要重新启动加载程序

答案 1 :(得分:0)

如果我正确理解您的问题,您可能不想担心尝试通过notifyChange更改数据集。我认为你很可能只想简单地启动一个新的加载器(或者对现有的加载器进行强制重新加载)。让加载器在加载完成时设置适配器,这将导致数据集上的通知。

即。用户单击菜单,然后使用新的查询参数/其他信息激活加载程序。如果加载程序已在运行,您可以取消它并开始新的加载等。