web-dev-qa-db-ja.com

ViewPager2で現在のフラグメントを取得する方法

私はこの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 i以下のように、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()

しかし、swipeRefreshを作成するときに問題が発生します。 swipeRefreshがフラグメント内のメソッドにアクセスするには、現在のフラグメントが必要です。しかし、FragmentStateAdapterにはNO METHODgetItemがあります。誰でも手伝ってくれる?

1
Nanda Z
  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フラグメントの位置を指定するか、必要なメソッドを使用して基本クラスを作成し、フラグメントをそこにキャストします。

1
Oleg Skidan