ViewPager2 无法动态添加删除片段

Abh*_*sal 8 android android-fragments android-viewpager android-viewpager2

在索引处删除/添加片段会导致 Viewpager2 出现意外行为。这是不可能的,ViewPager但预计可以与Viewpager2. 它会导致重复的片段和不同步TabLayout。 这是一个重现此问题的演示项目。有一个切换按钮可以删除片段并将其重新附加到特定索引处。在这种情况下,附加的片段应该是绿色的,但它是蓝色的,不知何故有 2 个蓝色片段。

这是我的适配器的外观

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我也向谷歌提交了一个错误

Abh*_*sal 11

事实证明,如果您正在处理mutable集合,则需要覆盖这两个方法ViewPager2

override fun getItemId(position: Int): Long {
        return fragmentList[position].ordinal.toLong()
    }

    override fun containsItem(itemId: Long): Boolean {
        val fragment = FragmentName.values()[itemId.toInt()]
        return fragmentList.contains(fragment)
    }
Run Code Online (Sandbox Code Playgroud)

在我当前的适配器中添加这两个可以解决问题