我很难用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。如果可用的话,FragmentPagerAdapterPagerAdapter实现将使用现有的片段,否则它会调用到getItem(),因此您自己创建页面。因此,如果对页面片段使用setRetainInstance(true),并且正在使用FragmentPagerAdapter,则应该重用它们。
FragmentStatePagerAdapter似乎更复杂,如果您正在滚动自己的PagerAdapterSAN片段,则由您来实现缓存机制。

07-28 14:07