Forked from https://github.com/jshvarts/DiffUtilPayloadDemo
The original blog post with an explanation is here RecyclerView DiffUtil with Change Payload
How it works (tap to watch):
Code:
class ItemAdapter(
private val favoriteListener: (String, Boolean) -> Unit
) : ListAdapter<Item, ItemViewHolder>(ItemDiffCallback()) {
...
...
override fun onBindViewHolder(holder: ItemViewHolder,
position: Int,
payloads: MutableList<Any>) {
if (payloads.isEmpty()) {
super.onBindViewHolder(holder, position, payloads)
} else {
if (payloads[0] == true) {
// change 'favorite' icon state via holder
holder.bindFavoriteState(getItem(position).isFavorite)
}
}
}
}
class ItemDiffCallback : DiffUtil.ItemCallback<Item>() {
...
...
override fun getChangePayload(oldItem: Item, newItem: Item): Any? {
return if (oldItem.isFavorite != newItem.isFavorite) true else null
}
}
Jetpack Compose version is available through the branch jetpack-compose-list
Code:
LazyColumn {
items(
items = list,
key = { item -> item.id }
) { item ->
ListItem(item = item, onFavoriteClicked = {
onFavouriteClicked(item)
})
}
}
Dmitri Chernysh