ViewPager2、FragmentStateAdapter 以及 pager 的 currentItem 和适配器的 createFragment 的位置参数之间的冲突



在Kotlin中实现ViewPager2及其相关的FragmentStateAdapter的内容时,我遇到了一个奇怪的问题:它与适配器的createFragment(position: Int)方法和ViewPager2的setCurrentItem(item: Int, smoothScroll: Boolean)有关。目前,对于大小为2的适配器实现此功能是可以的,可以从视图页的位置0开始,并可以根据需要更改项。

问题然后来自于试图设置viewPager的currentItem值在适配器的创建是一个非零索引值改变默认的起始页到第二页(索引1)。createFragment的方法从适配器和它的位置参数不匹配索引我设置与viewPager的setCurrentItem方法。

下面是要演示的示例代码(请原谅使用视图绑定):
binding.myViewPager2.apply {
adapter = MyFragmentStateAdapter(it, this@MyFragment)
currentItem = 1 //start on 2nd page instead of 1st on viewpager2's load
}
//Here is my FragmentStateAdapter code
class MyFragmentStateAdapter(private val model: Model, fragment : Fragment) : FragmentStateAdapter(fragment) {
override fun getItemCount(): Int {
return model.listItems.size
}
override fun createFragment(position: Int): Fragment {
val item : dataSourceModel = model.listItems[position] 
Log.d("LogNameHere", "position: $position") //If CurrentItem is set to 1, this is still 0.
return MyFragment.createInstance(position, dataSourceModel.dataA)
}

上面的代码执行正确,直到我注意到currentItem不等于createFragment方法中使用的位置参数;currentItem设置为1,viewPager正确加载第二页,但createFragment中的位置参数设置为0。

我感到困惑和失落,因为我需要的位置是准确的,以显示适当的数据在MyFragment。我需要第二页不显示第一页的数据和createFragment的位置参数是相同的当前页面是关键。

如果需要,我很乐意提供更多的解释和代码来解释我的困境。

我怎么能有它,这样我就可以启动ViewPager在第二页与适当的数据基于提供给它的索引?谢谢你。

将此问题标记为通过SO上的另一个问题回答的问题。

ViewPager2 selectCurrentItem -选择标签,但在这个标签内放置错误的片段

最新更新