6

我有一个带有 ViewPager 的 FragmentActivity - 这个 ViewPager 包含三个 ListViews - 每个都注定有自己独特的适配器(和独特的数据集)。

我想使用 AsyncTaskLoader 来填充这些适配器,但仅当在 ViewPager 中选择给定视图时。

是否需要在活动的 onCreate 方法中初始化加载程序?(下面的代码)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_foo);

    getSupportLoaderManager().initLoader(0, null, this);
    getSupportLoaderManager().initLoader(1, null, this);
    getSupportLoaderManager().initLoader(2, null, this);
}

还是可以交互调用 initLoader(...) ,例如 OnPageChangeListener.onPageSelected 的侦听器的结果?

mPager.setOnPageChangeListener(new OnPageChangeListener() {
    @Override
    public void onPageSelected(int newPage) {
        getSupportLoaderManager().initLoader(newPage, null, this);
    }

    ...
}

如果用户可能只查看寻呼机中的第一个视图,我想避免必须预先执行可能 3 个耗时的加载程序。

编辑: 或者让 ViewPager 为每个视图使用一个 Fragment 会是一个更好的设计,并且每个 Fragment 将负责管理自己的加载器?

4

2 回答 2

1

我不记得细节了,但至少对于兼容性库,如果你不调用initLoader()from onCreate(),加载器的生命周期就会搞砸,所以你可能想调用它们onCreate()(可能在最新版本中修复,没有' t 测试)。IIRC,片段只使用活动的 LoaderManager,因此加载程序始终由活动管理。使用片段通常会使您的代码更清晰,因此请尽可能迁移到片段。

于 2011-11-18T03:03:16.733 回答
1

由于您已经在使用 Fragments,我建议您在视图寻呼机中使用 Fragments。我这样做了,而且效果更好。然后实际上您将为每个片段初始化一个加载器。如果这些片段相关,您可以定义抽象扩展并将通用初始化逻辑放在那里,然后您可以扩展它以创建具体片段

在上面的代码中,我发现每个后续加载器的初始化都会取消前一个加载器的执行,即使 ID 不同

于 2011-11-18T03:07:18.063 回答