【问题标题】:Is there special solution to have fragments inside of ViewPager2?在 ViewPager2 中是否有特殊的解决方案?
【发布时间】:2019-06-01 17:49:52
【问题描述】:

我的应用中有一些页面,每个页面都是一个带有自己 ViewModel 的片段,并且它们都在 FrameLayout 中相互交换(我有特殊的 BottomNavigationView 来处理它们的交换)。

所以我想用 ViewPager2 替换 FrameLayout,但在这种情况下,我必须向 RecyclerView.Adapter 提供视图而不是片段,我的解决方案是将片段包装到一些视图中,例如 LinearLayout。

所以我的问题是:我认为这是最简单的解决方案吗?有没有更好的解决方案?

【问题讨论】:

  • 对不起,我没有明白你的意思。你能解释一下吗? “我必须向 RecyclerView.Adapter 提供视图而不是片段,我的解决方案是将片段包装到一些视图中”
  • 我的意思是 ViewPager2 正在通过 Recyclerview.Adapter 工作,并且其中的 ViewHolders 必须使用 View(restriction by primary View Holder constructor) 创建,这将是页面的根

标签: android android-fragments kotlin fragment androidx


【解决方案1】:

ViewPager2 可以使用多种类型的适配器,而不仅仅是 RecyclerView.Adapter

如果您想使用带有状态的 Fragments,只需简单地制作一个扩展 FragmentStateAdapter 的自定义适配器并实现必要的方法。您的自定义适配器应如下所示:

class MyCustomPagerAdapter(
    activity: FragmentActivity,
    private val fragments: List<Fragment>) : FragmentStateAdapter(activity) {

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

    override fun createFragment(position: Int): Fragment {
        return fragments[position]
    }
}

然后只需将 viewPager.adapter 设置为您的自定义适配器。每个片段都有自己的状态,并且 FragmentStateAdapter 实现了 StatefulAdapter,因此您的片段自动成为生命周期的一部分。

这里有一个例子:https://github.com/googlesamples/android-viewpager2

但是,如果您的视图不需要自己的状态,最好只使用带有 RecyclerView.Adapter 的视图。您将获得更好的性能。

【讨论】:

    猜你喜欢
    • 2014-08-10
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多