在 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)
}
}
您好,我 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)
}
}