在ViewPager2内部是否有片段的特殊解决方案?

时间:2019-06-01 17:49:52

标签: android kotlin fragment androidx

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

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

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

1 个答案:

答案 0 :(得分:0)

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一起使用。您将获得更好的性能。