【问题标题】:How to get Current Fragment in ViewPager2 [duplicate]如何在 ViewPager2 中获取当前片段 [重复]
【发布时间】:2020-04-08 08:25:00
【问题描述】:

我使用了这个 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 中没有 NO METHOD getItem。谁能帮帮我?

【问题讨论】:

  • 1.在适配器中创建属性以保存所有片段 2. 保存当前位置 3. 在需要时按位置从片段列表(属性)中获取片段
  • 你能用代码显示吗?所以我可以投票你的答案,如果它是正确的
  • 你熟悉 EventBus 吗?
  • @dariushf 不,还没有
  • @NandaZ : 请展示您的代码如何在 viewpager 中添加片段

标签: android android-fragments kotlin android-viewpager2


【解决方案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 作为您的片段位置,或使用您需要的方法创建基类并将获取片段转换为它。

【讨论】:

  • 作为注释 ViewPager2 有一个页面更改回调 developer.android.com/reference/androidx/viewpager2/widget/… 所以这可以在没有标签的情况下完成
  • 但是,我遇到了计数器问题。当我尝试单击索引大于 mutableList 大小并导致崩溃的选项卡时
  • 这怎么可能?你有比片段更多的标签吗?
  • 因为viewPager2!!.offscreenPageLimit = 1,所以我不创建所有片段,只创建两个片段用于第一次打开
  • 这不处理配置更改(即应用程序在后台运行内存不足) - createFragment 在发生这种情况时不会被调用,它会在不调用的情况下恢复并且您的列表变为空。
【解决方案2】:

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

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

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

关于@lawonga 对答案主题的评论,它在配置更改后仍然存在。

【讨论】:

  • 您似乎已经在此处获得了 fragment 引用。你是如何从你的适配器引用它的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
相关资源
最近更新 更多