我正在开发一款应用程序,它通过媒体滑块显示 Instagram 类型的帖子提要。我使用 Recyclerview 和 PagerSnapHelper 开发了一个后媒体滑块,以将媒体列表显示为水平寻呼机列表。但它仅加载用户可见的媒体,而不预加载下一个媒体。我进行了谷歌搜索,但没有找到如何在这种情况下设置页面的屏幕外限制。我知道我们可以通过使用
setOffscreenPageLimit
方法来使用 ViewPager2 来完成此操作,但不确定如何在我的 Recyclerview 与 PagerSnapHelper 用例中执行此操作。我担心我可能不得不使用 ViewPager2 重写媒体滑块。
我最近也遇到了同样的问题,最终在
ViewPager2
的源码中找到了解决方案。它包含 LinearLayoutManager
的内部实现,覆盖 calculateExtraLayoutSpace()
函数。因此,我实现了相同的 LayoutManager
并将其应用到使用 PagerSnapHelper
的 RecyclerView:
val layoutManager = object : LinearLayoutManager(recyclerView.context, HORIZONTAL, false) {
private val offscreenPageLimit = 2 // number of pages that will be retained to either side of the current page
override fun calculateExtraLayoutSpace(state: RecyclerView.State, extraLayoutSpace: IntArray) {
val offscreenSpace: Int = getPageSize(this) * offscreenPageLimit
extraLayoutSpace[0] = offscreenSpace
extraLayoutSpace[1] = offscreenSpace
}
}
fun getPageSize(layoutManager: LinearLayoutManager): Int = with(recyclerView) {
if (layoutManager.orientation == LinearLayoutManager.HORIZONTAL) {
width - paddingLeft - paddingRight
} else {
height - paddingTop - paddingBottom
}
}