首页 > 解决方案 > 片段转换的 ViewPager 和 RecyclerView 问题

问题描述

设置是这样的:

所以我的感觉是这个问题发生在 ViewPager2 与 RecyclerView 和 FragmentTransitions 通过导航之间。为什么?好吧,单击“返回”箭头会使事务转到“主”屏幕,但具有 viewpager 的主屏幕也处理片段转换,这会以某种方式产生问题。

为了提供更多上下文,这是设置选项卡/viewpager 的方式(在 HomeFragment 中):

    val viewPager: ViewPager2 = container.findViewById(R.id.viewPager)
    viewPager.adapter = PagerAdapter(parentFragmentManager, lifecycle)

    val tabLayout: TabLayout = container.findViewById(R.id.tabLayout)
    val names = arrayOf("Najbolje", "Popularno", "Novo")

    TabLayoutMediator(tabLayout, viewPager) { tab, position -> tab.text = names[position] }.attach()

这是适配器:

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

private val fragments = listOf<Fragment>(
    MyListFragment.newInstance(Type.TOP),
    MyListFragment.newInstance(Type.POPULAR),
    MyListFragment.newInstance(Type.NEW)
)

override fun getItemCount(): Int {
    return fragments.size
}

override fun createFragment(position: Int): Fragment {
    return fragments[position]
}


}

这是设置recyclerview的代码:

private fun setupRecyclerView() {
        val adapter = MyListAdapter(requireContext(), myService)

        binding.recyclerView.adapter = adapter
        binding.recyclerView.layoutManager = layoutManager

        viewModel.posts.observe(viewLifecycleOwner) { post -> adapter.submitList(posts.map { PostItem(it) }) }

        addScrollListener()
    }

类似的问题之一是通过在 setTabs 方法中将 parentFragmentManager 更改为 childFragmentManager 来解决的,但这会产生另一个问题,在“RecyclerView 已设置 layoutManager”的行中引发异常

如果没有提供足够的信息,请告诉我。

标签: androidandroid-jetpackfragmentmanagerandroid-viewpager2

解决方案


您使用的是错误的FragmentManager- 对于完全包含在另一个布局中的每个片段(例如您的ViewPager2托管片段),您必须使用它childFragmentManager来正确嵌套片段。

viewPager.adapter = PagerAdapter(childFragmentManager, lifecycle)

这不仅需要正确恢复您的状态(使用活动supportFragmentManager不会做的事情),而且要确保父片段首先经历其状态转换,然后子片段才会经历他们的转换,修复“已经执行交易”的问题。


推荐阅读