Как получить текущий фрагмент в ViewPager2 - PullRequest
0 голосов
/ 08 апреля 2020

я использовал эту зависимость ViewPager2:

реализация 'androidx.viewpager2: viewpager2: 1.0.0'

, затем я написал код и создал адаптер для FragmentStateAdapter, как показано ниже:

private inner class ViewPagerAdapter(fragmentManager: FragmentManager,
                                         lifecycle: Lifecycle, config: TribunConfig?)
        : FragmentStateAdapter(fragmentManager, lifecycle) {
        private val config: TribunConfig?
        override fun createFragment(position: Int): Fragment {
            return TribunNewsFragment.newInstance(if (menuTribun!!.get(position) == "News") "home"
            else menuTribun!!.get(position)!!.replace(" ", "").toLowerCase(), config)!!
        }

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

        init {
            this.config = config
        }
    }

метод in * onCreate Я реализую некоторый связанный с кодом viewpager2 и его адаптер, как показано ниже:

        viewPager2!!.offscreenPageLimit = 1
        viewPager2!!.adapter = ViewPagerAdapter(supportFragmentManager, lifecycle, config)
        TabLayoutMediator(tabLayout!!, viewPager2!!, TabLayoutMediator.TabConfigurationStrategy { tab: TabLayout.Tab?, position: Int -> tab!!.text = menuTribun!!.get(position) }).attach()

Но у меня проблема, когда я хочу сделать swipeRefre sh. Моему swipeRefre sh нужен текущий фрагмент для доступа к методу внутри фрагмента. Но в FragmentStateAdapter есть НЕТ МЕТОДА getItem. Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 08 апреля 2020
  1. Создать свойство в вашем адаптере, чтобы сохранить все ваши фрагменты
  2. Сохранить текущую позицию
  3. Получить фрагмент из списка фрагментов (свойство) по позиции, когда вам это нужно

Примерно так:

    val fragments: MutableList<Fragment> = mutableListOf()

    private val config: TribunConfig?
    override fun createFragment(position: Int): Fragment {
        val fragment = TribunNewsFragment.newInstance(if (menuTribun!!.get(position) == "News") "home"
        else menuTribun!!.get(position)!!.replace(" ", "").toLowerCase(), config)!!

        fragments.add(fragment)
        return fragment
    }

Родитель:

 yourTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
        override fun onTabSelected(tab: TabLayout.Tab?) {
            val fragment = adapter.fragments[tab!!.position]
            // cast fragment to your fragment class and do what you want
        }

        override fun onTabUnselected(tab: TabLayout.Tab?) {
        }

        override fun onTabReselected(tab: TabLayout.Tab?) {
        }
    })

Также вы можете использовать when или if-else для позиции ваших фрагментов или создать базовый класс с методами, которые вы нужно и разыграть получающий фрагмент к нему.

...