【问题标题】:Multiple fragments with different loadermanager具有不同 loadermanager 的多个片段
【发布时间】:2015-12-18 16:04:27
【问题描述】:

我对 android 开发相当陌生,过去 4 小时一直在寻找解决方案。

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

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

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

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

【问题讨论】:

    标签: android android-fragments android-loadermanager


    【解决方案1】:

    如果您将所有 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 的加载程序。

    【讨论】:

    • 我正在使用特定于活动的支持库中的加载程序管理器。将其更改为加载程序管理器,并且一切正常。谢谢!顺便说一句,在这种情况下,有什么方法可以应用支持加载器管理器而不是加载器管理器。一个特定于一个 Activity 的加载器管理器?
    • 我想这是可能的,但我不确定你的意思。当我想到它时,每个 ListView 都是特定于每个 Fragment 的,这就是为什么我觉得 Fragment 应该对它负责。如果你想把它放在 Activity 中,只要有两个适配器实例并将每个适配器分配给适当的 ListView,我认为它可以通过一些调整来工作。
    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 2018-06-11
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多