Skip to content

mobiledevpro/DiffUtilPayloadDemo

 
 

Repository files navigation

RecyclerView DiffUtil Payload demo

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):

Alt text

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

Alt text

Code:

      LazyColumn {
                items(
                    items = list,
                    key = { item -> item.id }
                ) { item ->
                    ListItem(item = item, onFavoriteClicked = {
                        onFavouriteClicked(item)
                    })
                }
            }

Follow:

Dmitri Chernysh

Youtube Instagram Twitter Linkedin