はじめに
RecyclerViewを使用したリスト形式のUIを実装するケース非常に多いですよね。
都度調べて実装しているとコストがかかるので、サッとコピペしてすぐ使えるテンプレートを残しておこうと思います。
テンプレート内容
実装は以下です。
TemplateListAdapter.kotlin
class TemplateListAdapter(
private val viewLifecycleOwner: LifecycleOwner,
private val onClickItem: (Unit) -> Unit
) : ListAdapter<Unit, TemplateListAdapter.TemplateListItemViewHolder>(ListCallback) {
private object ListCallback : DiffUtil.ItemCallback<Unit>() {
override fun areItemsTheSame(
oldItem: Unit,
newItem: Unit
): Boolean {
return oldItem == newItem
}
override fun areContentsTheSame(
oldItem: Unit,
newItem: Unit
): Boolean {
return oldItem == newItem
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TemplateListItemViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
return TemplateListItemViewHolder(
binding = ItemTemplateBinding.inflate(layoutInflater, parent, false),
onClickItem = onClickItem
)
}
override fun onBindViewHolder(holder: TemplateListItemViewHolder, position: Int) {
holder.bind(
viewLifecycleOwner = viewLifecycleOwner,
item = getItem(position)
)
}
class TemplateListItemViewHolder(
private val binding: ItemTemplateBinding,
private val onClickItem: (Unit) -> Unit
) : RecyclerView.ViewHolder(binding.root) {
fun bind(
viewLifecycleOwner: LifecycleOwner,
item: Unit
) {
binding.run {
lifecycleOwner = viewLifecycleOwner
this.item = item
setOnClickItem {
onClickItem(item)
}
executePendingBindings()
}
}
}
}
item_template.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android" >
<data>
<variable
name="onClickItem"
type="View.OnClickListener" />
<variable
name="item"
type="Unit" />
<import type="android.view.View" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
以上になります。
基本的に各種型の設定はUnitになっているので、必要に応じて修正してください。
また、areItemsTheSameの比較条件なども同様です、idを比較するなど都度適した形へ調整して使っていただければと思います。
さいごに
プロジェクト内のリソースをコピーして使うのもいいですが、新規のケースなどはこういったテンプレートがあると便利ですね。
是非ご活用いただければと思います。