使用多个适配器设置多个游标加载器 - Android

时间:2014-04-05 23:32:42

标签: android android-cursorloader

我想在我的应用程序片段中有两个游标加载器。它们中的每一个都有不同的数据集,并在不同的列表中使用。

我找到了一个用光标你可以使用getId()方法然后使用switch做某事的地方。但是,总有方法:getLoaderManager().initLoader(0,null,this);之后可以是这样的:

adapter = new SimpleCursorAdapter(context, android.R.layout.simple_list_item_1, null, from, to, 0);

此方法仅适用于一个光标,但如果我有adapter1adapter2怎么办?如何确定哪个光标适用于哪个适配器?

3 个答案:

答案 0 :(得分:1)

不需要单独的加载器回调。答案在于传递给加载程序管理器的ID:

private static final int LOADER_A_ID = 1;
private static final int LOADER_B_ID = 2;

public void onCreate(Bundle savedInstanceState) {
    ...

    getLoaderManager().initLoader(LOADER_A_ID, null, this);
    getLoaderManager().initLoader(LOADER_B_ID, null, this);
}

public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) {
    switch (loaderId) {
        case LOADER_A_ID:
            // return loader for cursor A/ adapter A

        case LOADER_B_ID:
            // return loader for cursor B/ adapter B
    }
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    switch (loader.getId()) {
        case LOADER_A_ID:
            adapterA.swapCursor(cursor);
            break;

        case LOADER_B_ID:
            adapterB.swapCursor(cursor);
            break;

    }
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    ...
}

您可以通过这种方式制作任意数量的游标加载器,并且只实现一次回调方法。

答案 1 :(得分:1)

我的解决方案是实现回调侦听器

public class Query extends  FragmentActivity {//do not implement callbacks
getSupportLoaderManager().initLoader(Constants.LOADER_DAILY_TASK,
null,dailyTaskResultLoaderListener);//note listener not "this"
getSupportLoaderManager().initLoader(Constants.LOADER_OTHER_TASK,
null,otherTaskResultLoaderListener);//note listener not "this"

private LoaderCallbacks<Cursor> dailyTaskResultLoaderListener
= new LoaderCallbacks<Cursor>() {   
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bun) {     
        return  new CursorLoader(getBaseContext(),
Constants.DAILY_TASK_URI,projection, selection,selArgs,null); }
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) 
{...}
public void onLoaderReset(Loader<Cursor> cursor) {...}};
private LoaderCallbacks<Cursor> otherTaskResultLoaderListener
= new LoaderCallbacks<Cursor>() {       

....我想你明白了

答案 2 :(得分:0)

一种可能的解决方案就是这样。从LoaderCallbacks声明中删除Fragment接口,然后创建两个单独的LoaderCallbacks实现,每个适用于您要设置的每个适配器。最后,在每个实现的onLoadFinished方法中设置适配器。

public class ExampleFragmen extends Fragment { // Don't implement LoaderCallbacks here.

    private static final int LOADER_A = 0;
    private static final int LOADER_B = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        getLoaderManager().restartLoader(LOADER_A, null, new LoaderACallbacks());
        getLoaderManager().restartLoader(LOADER_B, null, new LoaderBCallbacks());
        ...
    }

    public class LoaderACallbacks implements LoaderCallbacks<Cursor> {

        @Override
        public Loader<Cursor> onCreateLoader(int loader, Bundle args) {
        }

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
            // Set up adapter A here...
        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
        }

    }

    public class LoaderBCallbacks implements LoaderCallbacks<Cursor> {

        @Override
        public Loader<Cursor> onCreateLoader(int loader, Bundle args) {
        }

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
            // Set up adapter B here...
        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {
        }

    }

}