带有多个加载器的LoaderManager:如何获得正确的游标加载器

Kay*_*den 116 android android-loadermanager android-loader

对我来说,如果您有多个装载机,如何获得正确的光标并不清楚.让我们说你定义了两个不同的Loader:

getLoaderManager().initLoader(0,null,this);
getLoaderManager().initLoader(1,null,this);
Run Code Online (Sandbox Code Playgroud)

然后在onCreateLoader()中你根据id做不同的事情:

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {

    if (id==0){
               CursorLoader loader = new CursorLoader(getActivity(),
            MaterialContentProvider.CONTENT_URI,null,null,null,null);
    }else{
               CursorLoader loader = new CursorLoader(getActivity(),
            CustomerContentProvider.CONTENT_URI,null,null,null,null);
            };
    return loader;
} 
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是如何在onLoadFinished()中获得正确的光标,因为你没有得到任何id来识别正确的Cursoradapter光标.

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {


    mycursoradapter1.swapCursor(cursor);
    if(isResumed()){
        setListShown(true);
    }else {
        setListShownNoAnimation(true);
    }



}
//and where to get the cursor for mycursoradapter2
Run Code Online (Sandbox Code Playgroud)

或者我错了,这是在一个片段中获得两个不同cursoradapter的结果的错误方法.

Kur*_*aum 119

Loader类有一个名为getId()的方法.我希望这会返回你与加载器关联的id.

  • @Jords技术上是正确的.我不是在辩论.但是,当你可以调用`getId()`时,为什么所有这些都会变得严峻? (6认同)
  • 我正在考虑使用内部/匿名类来执行此操作,以便每个加载器都有自己的对象来获取回调. (2认同)

Igo*_*sky 32

使用Loader 的getId()方法:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    switch (loader.getId()) {
        case 0:
            // do some stuff here
            break;
        case 1:
            // do some other stuff here
            break;
        case 2:
            // do some more stuff here
            break;
        default:
            break;
    }
}    
Run Code Online (Sandbox Code Playgroud)


Bla*_*der 8

如果你的加载器没有任何共同点但是结果的类类型(这里:) Cursor,你最好创建两个独立的LoaderCallbacks实例(简单地作为Activity/Fragment中的两个内部类),每个实例专用于一个加载器处理,而不是而不是试图将苹果与橙子混合.

在您的情况下,似乎数据源和结果处理都不同,这要求您编写额外的样板代码以识别当前场景并将其分派到适当的代码块.

  • 通信通道是`LoaderCallbacks`.没有什么需要将`Activity`本身用作`LoaderCallbacks`.在需要时创建多个通信通道更简单. (3认同)