Android Kotlin基礎講座 07.2:DiffUtilとRecycleViewのデータバインディング
目次
タスク:ListAdapterを使ってリストを管理する
RecyclerViewを使って変化するリストを表示するのは一般的なパターンです。RecyclerViewはアダプタークラスであるListAdapaterを用意しており、これはリストに裏打ちされたRecyclerViewアダプターを作成するのに役立ちます。
ListAdapterはリストをトラックし続け、リストが更新された際にはアダプターに通知してくれます。
ステップ1:アダプターにListAdapterを継承させる
- SleepNightAdapter.ktファイル内、SleepNightAdapterのクラスシグネチャを変更して、ListAdapterを継承させてください。
- 促されたら、androidx.recyclerview.widget.ListAdapterをインポートしてください。
- SleepNightAdapter.ViewHolderの前に、一つ目の引数としてSleepNightをListAdapterに追加してください。
- コンストラクタにパラメーターとしてSleepNightDiffCallback()を追加してください。ListAdapterはこれを使ってリスト内の何が変わったのかを調べます。変更後のSleepNightAdapterクラスシグネチャは以下のようになります。
class SleepNightAdapter : ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback()) {
- SleepNightAdapterクラス内のセッターも含めたdataフィールドを削除してください。ListAdapterがリストをトラックしてくれるのでもう必要ありません。
- getItemCount()のオーバーライドも削除してください。ListAdapterがこのメソッドを実装してくれるので必要ありません。
- onBindViewHolder()内のエラーを取り除くために、item変数を変更します。itemを取得するためにdataを使う代わりに、ListAdapterが用意しているgetItem(position)メソッドを呼び出してください。
val item = getItem(position)
ステップ2:リストを更新し続けるためにsubmitList()を使う
変更されたリストが利用可能であるときにはListAdapterに伝える必要があります。ListAdapterはsubmitList()というListAdapterにリストの新しいバージョンが利用可能であることを伝えるためのメソッドを用意しています。このメソッドが呼ばれると、ListAdapterは新しいリストと古いリストを比較して、追加、削除、移動、変更されたアイテムを発見します。そしてRecyclerViewによって表示されるアイテムを更新します。
- SleepTrackerFragment.ktを開いてください。
- onCreateView()内の、sleepTrackerViewModelのオブザーバー内の削除したdata変数が参照されているエラーを見つけてください。
- adapter.data = itをadapter.submitList(it)の呼び出しに置き換えてください。変更後のコードは以下のようになります。
sleepTrackerViewModel.nights.observe(viewLifecycleOwner, Observer {
it?.let {
adapter.submitList(it)
}
})
- アプリを起動してください。以前よりも早く起動します。今回はリストが小さいので、体感的には変わらないかもしれません。