3

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

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

@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 上注入新的“查询”值?

4

2 回答 2

9

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

@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);

所以你只需要重新启动加载器

于 2013-10-01T06:06:20.007 回答
0

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

IE 用户单击菜单,然后您使用新的查询参数/其他信息触发加载程序。如果加载程序已经在运行,您可以取消它并启动一个新的等。

于 2013-07-20T00:00:22.683 回答