在 ViewPager2 中是否有特殊的解决方案?

Nev*_*Mem 4 android fragment android-fragments kotlin androidx

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

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

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

小智 5

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]
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是,如果您的视图不需要自己的状态,最好只使用带有 RecyclerView.Adapter 的视图。你会得到更好的表现。