Android - ListAdapter<T, VH>をつかう
リストの更新処理をユーティリティ頼りにする。そして非同期的に行う。
Created at

497 Words
⚠️

以前の記事DiffUtil の使い方をメモして、非同期にやるやつ( AsyncListDiffer )についてはあまり触れていなかったのでそいつの使い方を書く。

ListAdapter<T, VH>

なにそれ

内部で AsyncListDiffer を使ってくれるRecyclerView.Adapter。もうこれでいいじゃんみたいな気持ちになる。

submitList()メソッドがpublicな点にモニョっときたら AsyncListDiffer を自前で用意すればいいのかもしれない。

どちらを使用するにしても手間はそれほど変わらないように感じた。

使い方

// T: リスト項目の型, VH: ViewHolder
class HogeAdapter : ListAdapter<Item, RecyclerView.ViewHolder>(DiffCallback()) {
    private class DiffCallback : DiffUtil.ItemCallback<Item>() {
        // 同じ項目か判別する
        override fun areItemsTheSame(
            oldItem: Item,
            newItem: Item
        ): Boolean {
            return oldItem.id == newItem.id
        }

        // 項目の内容がアップデートされているかを判別する
        override fun areContentsTheSame(
            oldItem: Item
            newItem: Item
        ): Boolean {
            return oldItem == newItem
        }
    }

    // 現在のリストはcurrentListを参照する
    override fun getItemCount() = currentList.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
        LayoutInflater.from(parent.context).let { inflater ->
// ...省略
        }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
// ...省略
    }

}

リストを更新したりアイテムを追加・削除したりするときは、更新後のリストをsubmitList()に渡す。

adapter.submitList(newList)

渡した後で加工して表示したいなどの需要がある場合、なんかメソッド生やしたりする。submitListを外に見せたくない場合は上に書いたようにListAdapterではなく AsyncListDiffer 使う。

See Also