删除viewPager2中片段,FragmentStateAdapter不起作用

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

我有3个片段- F1、F2和F3。我已经将它们附加到了一个PagerAdapter(viewPager 2)中。PagerAdapter在PagerFragment(在onCreateView中)中的初始化是-

binding = PagerFargmentBinding.inflate(inflater, container, false)
adapter = PagerAdapter(this)
binding?.viewPager?.adapter = adapter
binding?.viewPager?.isSaveEnabled = false

现在,我的PagerAdapter实现--〉

class PagerAdapter(
    fragment: PagerFragment,
) : FragmentStateAdapter(fragment) {

    private var nextFragment: BaseFragment? = null
    private var baseFragment: BaseFragment = F1()

    override fun getItemCount() = 2

    override fun createFragment(position: Int): Fragment {
    
        return when (position) {
            0 -> {
                baseFragment
            }
            else -> {
                nextFragment ?: DummyDialogFragment()
            }
        }
    }

    fun setNextFragment(page: Int) {
        nextFragment = null
        nextFragment = if (page == 1) {
            F2()
        } else if (page == 2) {
            F3()
        } else {
            null
        }
    }
 }

现在从我的呼叫器片段我正在设定下一个片段-

fun navigateTo(page: Int) {
    adapter.setNextFragment(page)
    if (page == 0) {
        binding?.viewPager?.currentItem = page
    } else {
        binding?.viewPager?.currentItem = 1
    }
}
  • 从F1片段中,我使用1和2调用此函数。第一次运行时运行正常。***如果是第一次,如果我将F2片段作为nextFragment加载,则不会显示F3片段。**我已尝试调试,发现nextFragment值正在更新,但不知何故,添加的片段未从寻呼适配器中删除。
    是否有任何方法可以动态添加/删除片段?
  • 我从这个模块中获得了实现思想-https://intensecoder.com/android-swipe-fragments-with-viewpager2-in-kotlin/ *
x6h2sr28

x6h2sr281#

在对stackoverflow进行了相当多的探索之后,在我的一位同行的帮助下,我找到了解决方案。解决方案是-
实际上问题是,createFragment()在第一次触发后就没有触发。所以我必须重写StatePagerAdapter的两个函数- getItemViewType()和getItemId()。我现在的实现-

class PagerAdapter(
    fragmentManager: FragmentManager,
    lifecycle: Lifecycle
) : FragmentStateAdapter(fragmentManager, lifecycle) {

    private var viewType: Int = 0

    override fun getItemCount() = 2

    override fun createFragment(position: Int): Fragment {
        return when (position) {
            0 -> {
                F1()
            }
            1 -> {
                F2()
            }
            else -> {
                F3()
            }
        }
    }

    override fun getItemViewType(position: Int): Int {
        return when (position) {
            0 -> 0
            else -> viewType
        }
    }

    override fun getItemId(position: Int): Long {
        return when (position) {
            0 -> 0
            else -> viewType.toLong()
        }
    }

    fun setNextFragment(page: Int) {
        this.viewType = page
    }
 }

从分页器片段调用这个-

fun navigateTo(page: Int) {
    adapter.setNextFragment(page)
    if (page == 0) {
        binding?.viewPager?.currentItem = page
    } else {
        binding?.viewPager?.currentItem = 1
    }
}

setNextFragment()分配所需的F2()或F3()片段。并且通过getItemId()和getItemViewType()上的覆盖实现的帮助,每次都调用createFragment(),因此我可以动态添加/删除片段。

相关问题