以前の記事 で 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
使う。