我的应用程序中有一些页面,每个页面都有它自己的ViewModel,它们都在FrameLayout中互相交换(我有特殊的BottomNavigationView来处理它们的交换)。
所以我想用ViewPager2替换FrameLayout,但是在这种情况下,我必须向RecyclerView.Adapter提供Views not Fragments,而我的解决方案是将片段包装到某些视图中,例如LinearLayout。
所以我的问题是:这是最简单的解决方案吗?还有更好的解决方案吗?
答案 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一起使用。您将获得更好的性能。