KotlinTips: ViewPager2(RecyclerView.Adapter)
Contents
概要
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サイト