如何在ViewPager2中获取当前片段

时间:2020-04-08 08:25:00

标签: android android-fragments kotlin android-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
        }
    }

方法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()

但是当我想进行swipeRefresh时遇到问题。我的swipeRefresh需要当前片段才能访问片段中的方法。但是FragmentStateAdapter中没有没有方法 getItem。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

  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?) {
        }
    })

此外,您可以将whenif-else用于片段位置,或使用所需的方法创建基类并对其进行强制转换。

答案 1 :(得分:1)

按照@Oleg的回答,您可以在适配器中访问像这样的片段,而不是创建本地列表并在createFragment方法上添加每个片段:

private val fragmentList: List<TribunNewsFragment>
        get() {
            return fragment.childFragmentManager.fragments.filterIsInstance<TribunNewsFragment>()
        }

如果要在另一个片段中创建ViewPager,请务必使用childFragmentManager而不是fragmentManager

关于@lawonga对答案主题的评论,它可以保留配置更改。

相关问题