我很难通过ViewPager
从配置更改中恢复。
我想要的是保存当前的寻呼机位置,以便在配置更改后,将显示相同的页面。为此,我保存pager.getCurrentItem()
并使用pager.setCurrentItem
恢复它。只是这不起作用:setCurrentItem
实际上尝试重新创建该页面而不是选择它!即使页面已经创建,也就是这样。
现在我不确定在实现支持它的适配器时是否遗漏了一些东西,但setCurrentItem
是否存在陷阱以及ViewPager
认为它是否已完全构建?看一下那个函数的代码,对我来说没有意义;似乎总是尝试重新创建一个页面,除非根本没有项目:
void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
// these are the only checked that make this method return
if (mAdapter == null || mAdapter.getCount() <= 0) {
setScrollingCacheEnabled(false);
return;
}
if (!always && mCurItem == item && mItems.size() != 0) {
setScrollingCacheEnabled(false);
return;
}
// ... removed some init code
mCurItem = item;
populate();
// ...
}
如您所见,始终会调用populate()
,除非根本没有任何项目,或者您尝试选择的项目已被选中。是什么赋予了?这对我没有意义。
答案 0 :(得分:3)
setCurrentItem实际上尝试重新创建该页面而不是选择它!即使页面已经创建,也就是这样。
不完全是这样,至少就我如何阅读代码而言。
如您所见,总是调用populate(),除非根本没有任何项目,或者您尝试选择的项目已被选中。
populate()
会致电addNewItem()
,呼叫instantiateItem()
上的PagerAdapter
。 FragmentPagerAdapter
PagerAdapter
实现将使用现有片段(如果可用),否则会调用getItem()
,因此您自己创建页面。因此,如果您对页面片段使用setRetainInstance(true)
,并且使用FragmentPagerAdapter
,则应重复使用它们。
FragmentStatePagerAdapter
似乎更复杂,如果您正在滚动自己的PagerAdapter
sans片段,则由您来实现缓存机制。