2

我决定尝试新的和现在可用的稳定版本ViewPager2.

ViewPager2有很多页面,并且我正在使用TabLayout为每个页面(片段)提供可滚动的标签标题,但是ViewPager2在我的视图中第一次加载时我面临延迟。

这是正常行为吗?

4

2 回答 2

2

我弄清楚是什么导致了ViewPager2加载页面的初始延迟。

碰巧我正在使用TabLayoutfromcom.google.android.material.tabs.TabLayout以及ViewPager2为每个页面提供可滚动的标签标题。但是,如果您有很多页面(例如我的情况),则 UI 需要时间来设置每个选项卡并将其放置在 UI 中。

解决方案是删除TabLayoutfrom ViewPager2,如果您需要显示标题,请通过根据需要更改和设置文本来ToolBar为每个页面使用 as title page 指示符。ToolBar

从好的方面来看,您最终会得到更干净的 UI,因为屏幕上有更多空间供您 ViewPager2向用户显示其内容。

我注意到的另一件事是,如果您想充分利用ViewPager2性能优势,请使用默认的 viewpager 的 offscreenPageLimit,如下所述:

公共无效 setOffscreenPageLimit (int 限制)

设置应保留到当前可见页面任一侧的页面数。超出此限制的页面将在需要时从适配器重新创建。将此设置为 OFFSCREEN_PAGE_LIMIT_DEFAULT 以使用 RecyclerView 的缓存策略。给定值必须大于 0 或 #OFFSCREEN_PAGE_LIMIT_DEFAULT。

远离当前页面的限制页面内的页面被创建并添加到视图层次结构中,即使它们在屏幕上不可见。超出此限制的页面将从视图层次结构中删除,但 ViewHolders 将像往常一样由 RecyclerView 回收。

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

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

https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2.html#setOffscreenPageLimit(int)

话虽如此,我强烈建议在所有情况下更换您的ViewPagerto ViewPager2,因为 ViewPager不再接受 Google 支持,并且ViewPager2除了我在这里所说的之外,还有很多东西可以提供:

RTL(从右到左)布局支持

垂直方向支持

可靠的 Fragment 支持(包括处理对底层 Fragment 集合的更改)

数据集更改动画(包括 DiffUtil 支持)

https://developer.android.com/jetpack/androidx/releases/viewpager2

于 2020-01-30T07:04:08.057 回答
1

对 ViewPager有一整套改进:

  • RTL(从右到左)布局支持
  • 垂直方向支持
  • 可靠的 Fragment 支持(包括处理对底层 Fragment 集合的更改)
  • 数据集更改动画(包括 DiffUtil 支持)

这些功能永远不会在 ViewPager 中得到修复,因此迁移到 ViewPager2 将是获得这些功能的唯一方法。

于 2020-01-28T17:10:00.447 回答