我有一个带有ViewPager的FragmentActivity - 这个ViewPager包含三个ListView--每个ListView都有自己独特的适配器(和唯一的数据集)。
我想使用AsyncTaskLoader来填充这些适配器,但仅限于在ViewPager中选择给定视图时。
是否需要在activity的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为每个视图使用片段是一个更好的设计,每个片段都负责管理自己的加载器?
答案 0 :(得分:1)
我不记得详细信息,但至少使用兼容性库,如果你不从initLoader()
调用onCreate()
,加载器的生命周期会搞砸,所以你可能想调用它们来自onCreate()
(可能在最新版本中修复,尚未测试)。 IIRC,片段只使用活动的LoaderManager,因此加载器总是由活动管理。使用片段通常会使您的代码更清晰,因此如果可能,请迁移到片段。
答案 1 :(得分:1)
由于您已经使用了碎片,我建议您在视图寻呼机中使用碎片。我这样做,效果更好。那么你确实会为每个片段初始化一个加载器。如果这些片段是相关的,你可以定义抽象扩展并将常用的初始化逻辑放在那里,然后你可以扩展它以创建一个具体的片段
在上面的代码中,我发现即使ID不同,每个后续加载器的初始化也会取消前一个加载器的执行