2

我很难从配置更改中恢复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()始终调用,除非根本没有项目,或者您尝试选择的项目已被选中。是什么赋予了?这对我来说没有意义。

4

1 回答 1

3

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

不完全是,至少就我阅读代码的方式而言。

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

populate()会调用addNewItem(),哪个调用instantiateItem()就对了PagerAdapter。的FragmentPagerAdapter实现PagerAdapter将使用现有的片段(如果可用),否则它会调用getItem()以便您自己创建页面。所以,如果你使用setRetainInstance(true)你的页面片段,并且你正在使用FragmentPagerAdapter,它们应该被重用。

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

于 2012-06-20T16:06:17.280 回答