目次
- ListAdapterとは
- サンプルコード
- まとめ
実装内容

1. ListAdapterとは
ListAdapter
‥Recyclerviewを使用する際に,ViewHolder
がどのように生成されるかを定義できるクラスで,コンストラクタの引数としてDIFF_UTILのオブジェクトを与えることできる.ListAdapter
のsubmitList(List)
を呼び出し,リストを渡しUIの要素として利用することができる.また,この時に渡したリストを, DIFF_UTILが差分を求めることで,notifydatasetchanged等のメソッドを呼び出す必要がなくなる.個人的な解釈としては,ViewHolder
の生成方法を定義するためのクラス,DIFF_UTILを利用して,取得したリストの変化を検知するためのクラスとして解釈している.
2. サンプルコード
実装する内容は,ListAdapter
を継承したPersonListAdapter,継承先のコンストラクタに渡す,DiffUtil,Viewの内容を紐づけるViewHolder
があります.
それでは,実際にサンプルコードから実装方法を確認します.(レイアウト,表示するリストの説明は省略します.)
PersonListAdapter
class PersonListAdapter: ListAdapter<Person, PersonViewHolder>(DIFF_UTIL) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PersonViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
//このviewの生成方法に注意する必要ある
val binding = LayoutPersonDetailBinding.inflate(layoutInflater, parent, false)
return PersonViewHolder(binding)
}
override fun onBindViewHolder(holder: PersonViewHolder, position: Int) {
// 位置ごとで,viewと紐づける
holder.bind(getItem(position))
}
}
このクラスの役割は,Viewの情報を受け取って紐づけるViewHolderの生成方法と,表示するアイテムの位置とViweを紐づけるオーバーライドをここで行い,RecyclerViewの要素の作成方法を定義します.
PersonViewHolder
// layoutで紐づけられたviewを,ここでもらって,viewBindingで処理
class PersonViewHolder(
private val binding: LayoutPersonDetailBinding
): RecyclerView.ViewHolder(binding.root) {
fun bind(person: Person) {
binding.nameTextview.text = person.name
binding.ageTextview.text = person.age.toString()
}
}
RecyclerView構成要素のlayoutのviewをここで受け取り,モデルと表示する要素が一致するように処理を行います.
DiffUtil
val DIFF_UTIL = object : DiffUtil.ItemCallback<Person>() {
// オブジェクト特有の値を用いて比較を行う.
override fun areItemsTheSame(
oldItem: Person,
newItem: Person
): Boolean {
return oldItem.name == newItem.name
}
// オブジェクトの中身が同じであるかを確認する
override fun areContentsTheSame(
oldItem: Person,
newItem: Person
): Boolean {
// data class だから、この比較を行える
return oldItem == newItem
}
}
DiffUtilは,リストの差分を検知する役割を持っています.変更があった時に,リスト全体を呼び込んで変更を検知するわけではなく,変更があったポジションの変更を読み取ります.
MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val listAdapter = PersonListAdapter()
binding.recyclerview.adapter = listAdapter
binding.recyclerview.layoutManager = LinearLayoutManager(applicationContext)
listAdapter.submitList(Provider.personList)
}
}
submitList
で,表示したいリストを渡しています.上記の処理を完了すると,以下のようになります.

3. まとめ
RecyclerViewの実装に対して苦手意識があったのですが,ListAdapterを利用することで比較的楽に実装することができました.