来自viewpager2和我的父片段的SharedViewModel

时间:2020-03-15 23:27:32

标签: android android-fragments kotlin android-viewpager android-architecture-navigation

因此,我有一个片段,将其称为片段A,在其中我需要它作为我的sharedview模型的主要宿主。

所以我有这样

class FragmentA:Fragment() {

 private val model: SharedViewModel by viewModels()

}

现在,在片段A中,我设置了viewpager2适配器

private fun setupViewPagerWithTabLayout(
        productList: MutableList<Producto>,
        drinkList: MutableList<Producto>
    ) {
        val fragmentList = listOf(
            FragmentProducts.newInstance(productList),
            FragmentProducts.newInstance(drinkList))

        viewPager2.adapter = MyViewPageAdapter(requireActivity(),fragmentList)
        val tabLayoutMediator = TabLayoutMediator(tabLayout, viewPager2,
            TabLayoutMediator.TabConfigurationStrategy { tab, position ->

                when (position) {
                    0 -> {
                        tab.text = "Option1"
                    }
                    1 -> {
                        tab.text = "Option2"
                    }
                }

            })
        tabLayoutMediator.attach()
    }

在这里我实例化我的FragmentProduct,它位于viewpager中Fragment A的内部,但是我的适配器需要FragmentActivity

class MyViewPageAdapter(fragmentActivity: FragmentActivity,private val fragmentList: List<FragmentProducts>) :
    FragmentStateAdapter(fragmentActivity) {

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

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

因此,从FragmentA内包含的FragmentProducts中,我需要与此视图模型共享数据,但是当我执行此操作以将数据从该片段共享到FragmentA时

class FragmentProducts:Fragment(){

    private val model: SharedViewModel by viewModels ({requireParentFragment()})

}

我收到关注错误

java.lang.IllegalStateException:片段FragmentProducts {6953da8} (3a2f5cbb-113d-4ed2-8f85-56e04fcea356)f0}不是子片段,它 直接附加到com.example.MainActivity@dcc2679

所以,这是告诉我FragmentProducts引用了我的MainActivity,这就是逻辑,因为适配器的实例在FragmentActivity处需要requireActivity()

viewPager2.adapter = MyViewPageAdapter(requireActivity(),fragmentList)

因此,我需要传递FragmentA而不是requireActivity()作为该viewpager片段的宿主,但是在我的ViewPagerAdapter上,我无法传递FragmentStatePagerAdapter或其他东西来传递FragmentA作为该viewpager的上下文

自从我使用viewpager2以来,有没有办法让FragmentA托管FragmentProducts viewpager,这样我就可以在我的FragmentProducts中获取它

private val model: SharedViewModel by viewModels ({requireParentFragment()})

谢谢

1 个答案:

答案 0 :(得分:11)

您正在使用FragmentStateAdapter(fragmentActivity)。不要那样做将您的父片段传递给MyViewPageAdapter,并将那个传递给FragmentStateAdapter

class MyViewPageAdapter(
    parentFragment: Fragment,
    private val fragmentList: List<FragmentProducts>
) : FragmentStateAdapter(parentFragment) {