ViewPager:从配置更改中恢复

时间:2012-06-20 15:00:32

标签: android android-viewpager

我很难通过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(),除非根本没有任何项目,或者您尝试选择的项目已被选中。是什么赋予了?这对我没有意义。

1 个答案:

答案 0 :(得分:3)

  

setCurrentItem实际上尝试重新创建该页面而不是选择它!即使页面已经创建,也就是这样。

不完全是这样,至少就我如何阅读代码而言。

  

如您所见,总是调用populate(),除非根本没有任何项目,或者您尝试选择的项目已被选中。

populate()会致电addNewItem(),呼叫instantiateItem()上的PagerAdapterFragmentPagerAdapter PagerAdapter实现将使用现有片段(如果可用),否则会调用getItem(),因此您自己创建页面。因此,如果您对页面片段使用setRetainInstance(true),并且使用FragmentPagerAdapter,则应重复使用它们。

FragmentStatePagerAdapter似乎更复杂,如果您正在滚动自己的PagerAdapter sans片段,则由您来实现缓存机制。

相关问题