android - ViewPager2 无法动态添加删除 fragment

标签 android android-fragments android-viewpager android-viewpager2

在索引处删除/添加 fragment 会导致 Viewpager2 出现意外行为。 ViewPager 无法做到这一点但预计与 Viewpager2 合作.它会导致重复 fragment 和不同步TabLayout .
Here is a demo project它重现了这个问题。有一个切换按钮可以删除 fragment 并将其重新附加到特定索引处。在这种情况下,附加的 fragment 应该是绿色的,但它是蓝色的,并且不知何故有 2 个蓝色 fragment 。

这是我的适配器的外观

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
    }
}

我已提交 bug与谷歌以及

最佳答案

事实证明,如果您使用 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)
    }

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

关于android - ViewPager2 无法动态添加删除 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61406176/

相关文章:

java - 使用按钮的 onClickListener 更改 textview 上的文本

Android 2 ViewPager 同时滚动

android - 选项卡布局中间选项卡滚动不流畅

android - VideoView 不显示在 fragment 上

android - 实例化 PagerAdapter Android

android - 如何阻止Android应用程序在其上绘制? (避免Cloack&Dagger攻击)

java - 在 Android 上使用 FFmpeg 合并 mp3 文件

java - Android 帐户管理器在设置中删除选项菜单

android - HERE map 在 FrameLayout 上工作 popBackStack() 不工作

Android 无法保留嵌套在其他 fragment 中的 fragment