在 ViewPager2 中删除片段时出现 IllegalArgumentException

IllegalArgumentException when Deleting fragments in ViewPager2

您好,我 viewPager2 有 5 个片段。根据特定条件,我要么显示所有 5 个片段,要么我希望用户只能滚动浏览其中的 3 个片段(页面:1、4、5)。

为了删除片段 2 和 3,我做了以下操作,但它崩溃了,抱怨片段 2 不存在

private inner class PagerAdapter(fragment:Fragment) : FragmentStateAdapter(fragment) {
val map = mutableMapOf(1 to Frag1, 2 to Frag2, 3 to Frag3, 4 to Frag4, 5 to Frag5)

override fun createFragment(pos: Int): Fragment {
   return if(!map.containsKey(pos)) null else map[pos]!!
}

override getItemCount(): Int = map.size

init {
   if(conditionIsTrue) {
       map.remove(2)
       map.remove(3)
   }
}
}

如何在满足某些条件时从 viewPager 中删除某些片段?

错误: 当我滑动移动到下一页时:

java.lang.IllegalArgumentException: No fragment define for position 2

java.lang.IllegalArgumentException: No fragment define for position 2

这个错误的意思是试图找到位置2的片段;但找不到,因为地图只有 2 个项目(位置 0、1)。

所以,您更改了列表大小,但这不会影响适配器大小。

ViewPager2 在内部与 RecylerView 一起工作;当我们 RecyclerView 中的 remove/change 项时,我们必须调用 adapter.notifyXX 方法。

ViewPager2也需要同样的东西;在你的情况下 notifyItemRemoved() 需要为删除的位置调用:

init {
   if(conditionIsTrue) {
       map.remove(2)
       notifyItemRemoved(2)
       map.remove(3)
       notifyItemRemoved(3)
   }
}