私はすべての提案、解決策、ライブラリなどを試してきましたが、それらは純粋な循環ではなく、ほとんどの場合、3ページしかサポートされていません。
そこで、新しいViewPager
を使用して循環的な例を実装しました。新しいは、ビューのリサイクルを処理するためにaとsを使用し、期待どおりに機能します。ViewPager2
ViewPager
RecyclerView
ViewHolder
TLDR: GITHUB
この例では、3ページ以上の間の循環ナビゲーションをサポートViewPager2
する単一のアクティビティアプリを構築します。FragmentPagerAdapter
ライブラリのアルファバージョンを使用していますandroidx.viewpager2:viewpager2
が、このバージョン1.0.0-alpha06
は、GoogleがAPIをフリーズしてベータに移行する前に計画された最後のバージョンです。

1.ViewPager2
ライブラリをbuild.gradleの依存関係に追加します
dependencies {
implementation 'androidx.viewpager2:viewpager2:1.0.0-alpha06'
}
2.プロジェクトにビューを追加ViewPager2
します。
<androidx.viewpager2.widget.ViewPager2 xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/vwpHome"
android:layout_width="match_parent"
android:layout_height="match_parent" />
3.FragmentStateAdapter
アダプターを作成します。
getItemCount()
huuuuge番号を返す必要があります。(2147483647)
getCenterPage()
huuuuge番号に基づいて中央ページを返します。このメソッドは、に設定する最初のページの位置を取得するために使用されますViewPager2
。この場合、ユーザーは、の終わりに到達するために〜1073741823時間をスワイプする必要がありViewPager2
ます。
class CircularPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fragmentManager, lifecycle) {
override fun getItemCount() = Integer.MAX_VALUE
/**
* Create the fragment based on the position
*/
override fun createFragment(position: Int) = HomePagerScreens.values()[position % HomePagerScreens.values().size].fragment.java.newInstance()
/**
* Returns the same id for the same Fragment.
*/
override fun getItemId(position: Int): Long = (position % HomePagerScreens.values().size).toLong()
fun getCenterPage(position: Int = 0) = Integer.MAX_VALUE / 2 + position
}
HomeScreensは、ページ情報を含むENUMです。
enum class HomePagerScreens(@StringRes val title: Int,
val fragment: KClass<out Fragment>) {
HOME_1(R.string.home_1, FragmentHome::class),
HOME_2(R.string.home_2, FragmentHome::class),
HOME_3(R.string.home_3, FragmentHome::class)
}
4.アダプタをViewPagerに設定します
val circularAdapter = CircularPagerAdapter(supportFragmentManager, lifecycle)
vwpHome.apply {
adapter = circularAdapter
setCurrentItem(circularAdapter.getCenterPage(), false)
}