android-fragments 删除ViewPager2中的片段时出现IllegalArgumentException

wvyml7n5  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(165)

大家好,我有一个包含5个片段的viewPager2。根据特定的条件,我要么显示所有5个片段,要么让用户只能滚动其中3个片段(page:第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
1tu0hz3e

1tu0hz3e1#

java.lang.IllegalArgumentException: No fragment define for position 2
这个错误意味着它试图找到位置2的片段;但是因为Map只有2个项目(位置0,1),所以没有找到它。
因此,您更改了列表大小,但这不会影响适配器大小。
ViewPager2在内部与RecylerView一起工作;当我们删除/更改RecyclerView中的项时,我们必须调用adapter.notifyXX方法。
ViewPager2中也需要同样的情况;在您的情况下,需要为删除的位置调用notifyItemRemoved()

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

相关问题