SharedViewModel из viewpager2 и моего родительского фрагмента - PullRequest
0 голосов
/ 16 марта 2020

Итак, у меня есть один фрагмент, давайте назовем его «Фрагмент А», в котором мне нужно, чтобы он был основным узлом моей совместно используемой модели.

Итак, у меня есть вот так

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, который находится внутри фрагмента 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]
    }
}

. Из FragmentProducts, который содержится внутри FragmentA, мне нужно поделиться данными с этой моделью представления, но когда я делаю это для обмена данными из этого фрагмента с FragmentA

class FragmentProducts:Fragment(){

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

}

, я получаю следующее сообщение об ошибке

java .lang.IllegalStateException: Fragment FragmentProducts {6953da8} (3a2f5cbb-113d-4ed2-8f85-56e04fcea356) f0} не является дочерним фрагментом, он непосредственно присоединен к com.example. MainActivity@dcc2679

Итак, это говорит мне, что FragmentProducts ссылается на мою MainActivity, и это logi c, потому что экземпляр адаптера принимает requireActivity () для FragmentActivity в * 102 2 *

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

Итак, мне нужно передать вместо requireActivity () мой FragmentA в качестве хоста этого фрагмента viewpager, но в моем ViewPagerAdapter я не могу передать FragmentStatePagerAdapter или что-то еще, чтобы передать FragmentA в качестве контекста для этого viewpager

Поскольку я использую viewpager2, есть ли способ позволить FragmentA размещать ViewPager FragmentProducts, чтобы я мог получить его в своем FragmentProducts следующим образом

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

Спасибо

1 Ответ

4 голосов
/ 16 марта 2020

Вы используете FragmentStateAdapter(fragmentActivity). Не делай этого. Передайте родительский фрагмент в MyViewPageAdapter и передайте , что в FragmentStateAdapter.

class MyViewPageAdapter(
    parentFragment: Fragment,
    private val fragmentList: List<FragmentProducts>
) : FragmentStateAdapter(parentFragment) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...