如何在ViewPager2中添加无限/无限滚动?

时间:2019-11-06 17:15:58

标签: android android-viewpager2

我有一个连接到新ViewPager2的FragmentStateAdapter。在以前的ViewPager实现中,有很多方法可以实现无限/无限滚动。如何在ViewPager2中这样做?

谢谢。

4 个答案:

答案 0 :(得分:0)

滚动完成后,您应该返回view_pager的第一个或最后一个位置。

看到此问题- Changing ViewPager to enable infinite page scrolling

答案 1 :(得分:0)

这是我想出的:

class EndlessScrollAdapter internal constructor(
    fm: FragmentManager,
    lifeCycle: Lifecycle
) : FragmentStateAdapter(fm, lifeCycle) {

    private val items = mutableListOf<Model>()
    val firstElementPosition = Int.MAX_VALUE / 2

    fun updateList(list: List<Model>) {
        items.apply {
            clear()
            addAll(list)
        }
        notifyDataSetChanged()
    }

    override fun getItemCount(): Int = if (items.isNotEmpty()) Int.MAX_VALUE else 0

    override fun createFragment(position: Int): Fragment = ViewPagerFragment(
        items[position.rem(items.size)])
}

在“活动”或“片段”中,我们需要调用:

viewPager2.adapter = endlessScrollAdapter
endlessScrollAdapter.apply {
  updateList(someModelList)
  viewPager2.setCurrentItem(this.firstElementPosition, false)
}

从字面上看,这不是无止境的,但从用户的角度来看,这是无尽的,因为他永远也无法达到优势。 ViewPager2的长度为Int.MAX_VALUE,起始位置为Int.MAX_VALUE/2,因此用户可以前后滚动。

答案 2 :(得分:0)

定义一个扩展ViewPager2.OnPageChangeCallback的类:

class ViewPager2PageChangeCallback(private val listener: (Int) -> Unit) :
        ViewPager2.OnPageChangeCallback() {

    override fun onPageSelected(position: Int) {
        super.onPageSelected(position)
        when (position) {
            0 -> listener.invoke(5). // 0th element is a fake element in your list. When 0th element is opened(from 1 to 0) automatically open last element(5th index)
            6 -> listener.invoke(1). // 6th element is a fake element in your list. When 6th element is opened(from 5 to 6) automatically open first element(1th index)
        }
    }
}

然后在您的活动中从中创建一个实例。

onCreate(){
    viewPager2PageChangeCallback = ViewPager2PageChangeCallback {
        viewPager2.post {
            viewPager2.setCurrentItem(it, false)
        }
    }
    viewPager2.registerOnPageChangeCallback(viewPager2PageChangeCallback)
}

活动被销毁时,请从中注销。

override fun onDestroy() {
    super.onDestroy()
    viewPager2.unregisterOnPageChangeCallback(viewPager2PageChangeCallback)
}

答案 3 :(得分:0)

我对android还是很陌生,我整天阅读了所有可以找到的有关此问题的文章。我也有一个FragmentStateAdapter,在ViewPager2上附加了3个片段。

我的解决方案是覆盖some_other_function事件。在这里,我将状态和currentPosition保存在2个局部变量中;然后,在OnPageChangeCallback中,我添加了一个控件以了解:

  1. 如果滑动事件开始
  2. 如果新位置等于当前位置。观察日志时,我发现只有当我尝试从第一页向左滚动或从最后一页向右滚动时,它们才是相同的。
  3. 页面位置是第一位还是最后一位

如果所有这些条件都成立并且我在第一页上,那么我会将下一页设置为最后一页,反之亦然。

这是我的代码。我使用0和2,因为我有3个片段。

onPageScrolled