在Viewpager2中,对于特定索引添加/移除片段会导致意外的行为。这在
ViewPager
中是不可能的,但在Viewpager2
中却被期望能够实现。它会导致重复的片段和不同步的TabLayout
。这里有一个演示项目可以重现此问题。有一个切换按钮,可以移除一个片段并将其重新附加到特定索引处。在这种情况下,附加的片段应该是绿色的,但它是蓝色的,并且出现了两个蓝色片段。以下是我的适配器的样子:
class ViewPager2Adapter(activity: FragmentActivity) : FragmentStateAdapter(activity) {
val fragmentList: MutableList<FragmentName> = mutableListOf()
override fun getItemCount(): Int {
return fragmentList.size
}
override fun createFragment(position: Int): Fragment {
return when (fragmentList[position]) {
FragmentName.WHITE -> WhiteFragment()
FragmentName.RED -> RedFragment()
FragmentName.GREEN -> GreenFragment()
FragmentName.BLUE -> BlueFragment()
}
}
fun add(fragment: FragmentName) {
fragmentList.add(fragment)
notifyDataSetChanged()
}
fun add(index: Int, fragment: FragmentName) {
fragmentList.add(index, fragment)
notifyDataSetChanged()
}
fun remove(index: Int) {
fragmentList.removeAt(index)
notifyDataSetChanged()
}
fun remove(name: FragmentName) {
fragmentList.remove(name)
notifyDataSetChanged()
}
enum class FragmentName {
WHITE,
RED,
GREEN,
BLUE
}
}
我也向谷歌提交了一个漏洞报告
createFragment
中创建新的片段。 - Abhishek Bansal