我有一个连接到新ViewPager2的FragmentStateAdapter。在以前的ViewPager实现中,有很多方法可以实现无限/无限滚动。如何在ViewPager2中这样做?
谢谢。
答案 0 :(得分:0)
滚动完成后,您应该返回view_pager的第一个或最后一个位置。
答案 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
中,我添加了一个控件以了解:
如果所有这些条件都成立并且我在第一页上,那么我会将下一页设置为最后一页,反之亦然。
这是我的代码。我使用0和2,因为我有3个片段。
onPageScrolled