我很难用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()
始终被调用,除非根本没有项目,或者您试图选择的项目已被选中。给什么?这对我来说毫无意义。 最佳答案
setcurrentitem实际上试图重新创建该页,而不是选择它!即使页面已经创建好了。
不完全是,至少就我读代码的方式而言。
如您所见,始终调用populate(),除非根本没有项,或者您试图选择的项已被选中。populate()
将调用addNewItem()
,它在instantiateItem()
上调用PagerAdapter
。如果可用的话,FragmentPagerAdapter
的PagerAdapter
实现将使用现有的片段,否则它会调用到getItem()
,因此您自己创建页面。因此,如果对页面片段使用setRetainInstance(true)
,并且正在使用FragmentPagerAdapter
,则应该重用它们。FragmentStatePagerAdapter
似乎更复杂,如果您正在滚动自己的PagerAdapter
SAN片段,则由您来实现缓存机制。