KotlinTips: ViewPager2(RecyclerView.Adapter)

概要

ViewPager2はViewPagerを置き換える新しい仕組みであり、RecyclerViewを扱うのに似ています。
既存のViewPagerではFragmentの利用が前提になっており各ページに該当する画面をFragmentで表していたのに対し、ViewPager2ではViewHolderを利用しViewを利用する前提になっている点に注意が必要です。

FragmentStateAdapterを使用すればFragmentを使うことも出来ますので、既存のViewPagerからViewPager2に移行する場合など、ライフサイクルが必要かどうかなどを考慮し、使用するAdapterを決めましょう。

FragmentStateAdapterクラス

FragmentStateAdapterクラスは二つのメソッドを上書きする必要があります。

Pagerで管理するページ数を返します。

override fun getItemCount(): Int {
}

指定された位置(position)にあるFragmentを返します。

override fun createFragment(position: Int): Fragment {
}

RecyclerView.Adapterクラス

RecyclerViewを扱うのに似ていると書きましたが、Adapterに関してはRecyclerViewのAdapterをそのまま利用することもできます。

ViewHolderクラス

TabLayoutとの連携

TabLayoutと連携することにより、水平方向のページナビゲーションをわかりやすく表現することが出来ます。
TabLayoutは通常のコンポーネントなのでxmlで画面上部などに配置し、その下にViewPager2を引き延ばし配置するのが一般的な使い方です。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

配置しただけではバラバラのままなので、プログラムでTabLayoutMediatorを利用し、TabLayoutとViewPager2を紐づけます。

TabLayoutMediator(tabLayout, viewPager) { tab, position ->
    tab.text = "OBJECT ${(position + 1)}"
}.attach()

参考資料

サンプルプログラム

公式サイト

Codiveサイト

Advertisements

Others

Posted by codive