lev*_*gli 6 android infinite-scroll android-fragments android-viewpager
我创建了一个无限扩展FragmentPagerAdapter(在这个站点上有关于如何实现这一点的示例)。这允许我迭代 50 个(任意数量)52 个片段(每周一个)的集合,从而为用户提供无限的片段感觉。
通过调用在片段之间滚动/跳转时ViewPager.setCurrentItem,我看到了两种情况:
ViewPager.setCurrentItemInternal(查找以单词开头的注释We are doing a jump by more than one page)setCurrentItem在smoothScroll设置为true(ie 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);
}
Run Code Online (Sandbox Code Playgroud)
这是我超出我的深度的地方。为什么这if/else会导致我正在经历的现象?
解释非常简单 -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)应该按预期工作。不建议这样做,只需这样做以查看行为即可。如果您的片段中有一些困难的工作(例如从网络加载一些数据),那么启动时会出现很大的延迟,因为所有片段都会立即加载。
希望有帮助!
| 归档时间: |
|
| 查看次数: |
1668 次 |
| 最近记录: |