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