我已经创建了FragmentPagerAdapter的无限扩展(有关于如何在
this site上实现这一点的示例).这允许我迭代50个(任意数量)52个片段(每周一个),从而给用户带来无限的片段感觉.
通过调用ViewPager.setCurrentItem在片段之间滚动/跳转时,我看到两种情况:
>无论哪种方式只跳一个片段 – 一切都好.这可能是由于在ViewPager.setCurrentItemInternal中专门处理这个用例的代码(查找以我们正在跳过多个页面的单词开头的注释)
>跳过多个片段,只有当smoothScroll设置为true时调用setCurrentItem(即setCurrentItem(i,true)),才会在屏幕上正确显示新片段;否则有一个空白屏幕
从我所看到的,这可能是因为ViewPager.scrollToItem中包含以下代码:
if (smoothScroll) {
smoothScrollTo(destX, 0, velocity);
if (dispatchSelected) {
dispatchOnPageSelected(item);
}
} else {
if (dispatchSelected) {
dispatchOnPageSelected(item);
}
completeScroll(false);
scrollTo(destX, 0);
pageScrolled(destX);
}
这是我无法深入的地方.为什么这会导致我正在经历的现象?
最佳答案 解释非常简单 – ViewPager不会保留所有碎片的状态,因为如果它会保持所有状态都处于活动状态,那将对性能造成灾难.
这种情况下确实存在一个setOffscreenPageLimit方法.其目的是定义ViewPager应该从当前状态向左和向右保留多少个片段的状态.有关更多背景信息,请查看官方文档:https://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)
Set the number of pages that should be retained to either side of the current page in the view hierarchy in an idle state. Pages beyond this limit will be recreated from the adapter when needed.
This is offered as an optimization. If you know in advance the number of pages you will need to support or have lazy-loading mechanisms in place on your pages, tweaking this setting can have benefits in perceived smoothness of paging animations and interaction. If you have a small number of pages (3-4) that you can keep active all at once, less time will be spent in layout for newly created view subtrees as the user pages back and forth.
You should keep this limit low, especially if your pages have complex layouts. This setting defaults to 1.
因此,我们可以看到默认限制为1 – 这就是为什么只跳过一个片段才能完美运行的答案.它也是平滑滚动案例的答案 – 当您想要设置新的当前项目时,平滑滚动意味着您需要逐个滚动所有片段 – 这是默认限制1工作的情况.
因此,在您的情况下,您可以尝试setOffscreenPageLimit(52),然后setCurrentItem(50)应该按预期工作.不推荐,只是去看看行为.如果您的片段中有一些困难的工作(比如从网络加载一些数据),那么启动时会有很大的延迟,导致所有片段立即加载.
希望有所帮助!