Android Kotlin基礎講座 07.2:DiffUtilとRecycleViewのデータバインディング

Android Kotlin基礎講座

タスク:DiffUtilを使ってリストをリフレッシュする

このタスクでは、DiffUtilを使ってデータの変更に使うRecyclerViewの最適化を行うために、SleepNightAdapterをアップグレードします。

ステップ1:SleepNightDiffCallbackを実装する

DiffUtilクラスの機能を使うために、DiffUtil.ItemCallbackを継承します。

  1. SleepNightAdapter.ktを開いてください。
  2. SleepNightAdapterのクラス定義全体の後に、DiffUtil.ItemCallbackを継承するSleepNightDiffCallbackという新規クラスをトップレベルに作成してください。SleepNightをジェネリックパラメーターとして渡してください。
class SleepNightDiffCallback : DiffUtil.ItemCallback<SleepNight>() {}
  1. SleepNightDiffCallbackクラス名の上にカーソルを当ててください。
  2. Alt+Enter(Macの場合Option+Enter)を押して、Implement Membersを選択してください。
  3. ダイアログが開くので、Shiftを押しながらareItemsTheSame()とareContentsTheSame()メソッドを左クリックし、二つとも選択した状態でOKをクリックしてください。

これにより、以下に示すようにSleepNightDiffCallback内に二つメソッド用の型が生成されます。DiffUtilはこれらのメソッドを使ってリストとアイテムにどのような変更がされたかを発見します。

    override fun areItemsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun areContentsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
  1. areItemsTheSame()内、TODOの部分を渡された二つのSleepNightであるoldItemとnewItemが同じかどうかを確かめるコードで置き換えてください。もし二つのアイテムが同じnightIdを持っている場合、それらは同じアイテムですので、trueを返します。そうでなければ、falseを返します。DiffUtilはこれを使ってアイテムが追加、削除、移動されたかどうかを調べます。
override fun areItemsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
   return oldItem.nightId == newItem.nightId
}
  1. areContentsTheSame()内で、oldItemとnewItemが同じデータを含んでいるか、つまり等しいかどうかを確かめます。この同等性チェックは全てのフィールドをチェックします。SleepNightはデータクラスだからです。Dataクラスには自動でequalsといくつかのメソッドが定義されています。もしoldItemとnewItem間に違いがあった場合は、このコードがDiffUtilにアイテムが更新されているということを伝えます。
override fun areContentsTheSame(oldItem: SleepNight, newItem: SleepNight): Boolean {
   return oldItem == newItem
}

コメント

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました