具有不同 loadermanager 的多个片段

Multiple fragments with different loadermanager

我是 android 开发的新手,过去 4 小时一直在寻找解决方案。

我在一个 Activity 中有 2 个片段,它们都使用不同的 sqlite 表来存储数据,然后将这些数据放入适配器以在片段中显示。

我正在使用加载器管理器为两个片段创建两个不同的加载器(具有不同的 ID)。我在每个片段中定义加载器回调函数。问题是当我使用一个片段加载数据时,在该片段的 OnCreateLoader 中 return 第二个片段的空数据。

这是我在一个片段中实现的代码:

    @Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    if (id==1){
        String[] projection = {
                NoticeTable.COLUMN_ID,NoticeTable.COLUMN_TITLE
        };
        CursorLoader cursorLoader = new CursorLoader(this,
                NoticeContentProvider.ALL_NOTICE_URI, projection, null, null, null);
        return cursorLoader;
    }
    else{
        return null;
    }
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

    switch (loader.getId()) {
        case 1:
            adapter.swapCursor(data);
            break;
        case 0:
            break;
    }
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    switch (loader.getId()) {
        case 1:
            adapter.swapCursor(null);
            break;
        case 0:
            break;
    }
}

如果将所有 LoaderManager 函数放在每个 Fragment 中,应该不会有问题。设置将是这样的:

public class FragOne extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {}
public class FragTwo extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {}

然后,您可以在 Fragment 的 onResume 或类似的东西中初始化加载器,这样它就可以独立于其他 Fragment 工作。

我想添加一个使用常量变量作为加载程序 ID 的建议。我倾向于这样做:

public class FragOne extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
   private static final int FRAG_ONE_LOADER = 0;

   public void onLoaderReset(Loader<Cursor> loader) {
      switch(loader.getId()) {
         case FRAG_ONE_LOADER:
            doStuff();
            break;
         default:
            break;
      }
   }
}

由于您已将逻辑分离到每个片段中,FragmentOne 永远不会看到或访问 ID 为 FRAG_TWO_LOADER 的加载器。