ViewPager.setCurrentItem只能将smoothScroll设置为true

时间:2016-10-26 20:19:40

标签: android android-fragments android-viewpager infinite-scroll

我创建了FragmentPagerAdapter的无限扩展(有关如何在this site上实现此目的的示例)。这允许我迭代50个(任意数量)52个片段(每周一个),从而给用户带来无限的片段感觉。

通过调用ViewPager.setCurrentItem在片段之间滚动/跳转时,我看到了两种情况:

  1. 无论如何只跳一个片段 - 一切都好。这可能是由于ViewPager.setCurrentItemInternal中专门针对此用例的代码(查找以We are doing a jump by more than one page开头的注释)
  2. 跳过多个片段,只有在setCurrentItem设置为smoothScroll时调用true时才会在屏幕上正确显示新片段(即setCurrentItem(i, true)) ;否则有一个空白的屏幕
  3. 从我所看到的,这可能是因为ViewPager.scrollToItem中包含以下代码:

    if (smoothScroll) {
        smoothScrollTo(destX, 0, velocity);
        if (dispatchSelected) {
            dispatchOnPageSelected(item);
        }
    } else {
        if (dispatchSelected) {
            dispatchOnPageSelected(item);
        }
        completeScroll(false);
        scrollTo(destX, 0);
        pageScrolled(destX);
    }
    

    这是我无法理解的地方。为什么if/else导致我遇到的现象?

1 个答案:

答案 0 :(得分:2)

解释非常简单 - ViewPager不会保留所有碎片的状态,因为如果它会使所有状态保持活动状态,那将对性能造成灾难。

这种情况确实存在setOffscreenPageLimit方法。其目的是定义ViewPager应该保持从当​​前状态向左和向右保留多少个片段的状态。有关更多背景信息,请查看官方文档:https://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

  

将处于空闲状态的视图层次结构中当前页面任一侧应保留的页数设置为空闲状态。超出此限制的页面将在需要时从适配器重新创建。

     

这是作为优化提供的。如果您事先知道需要支持的页面数量或在页面上使用延迟加载机制,那么调整此设置可以获得分页动画和交互的感知平滑性。如果您有少量页面(3-4)可以一次保持活动状态,那么当用户来回翻页时,新创建的视图子树的布局花费的时间会更少。

     

您应该将此限制保持在较低水平,尤其是在您的网页布局复杂的情况下。此设置默认为1.

因为我们可以看到默认限制为1 - 这就是为什么只跳过一个片段才能完美运行的答案。它也是平滑滚动案例的答案 - 当你想要设置新的当前项目时,平滑滚动意味着你需要逐个滚动所有片段 - 这是默认限制1工作的情况。

因此,在您的情况下,您可以尝试setOffscreenPageLimit(52),然后setCurrentItem(50)应该按预期工作。 不建议,只是去看看行为。如果您的片段中有一些困难的工作(比如从网络加载一些数据)那么启动时会有很大的延迟,导致所有片段一次加载。

希望有所帮助!