Recyclerview Payload

2023. 7. 28. 16:35개발/Android

Payload란?

→ Recyclerview에 태워보내는 데이터

  • Recyclerview를 일부만 업데이트할때 사용됨
  • 전체를 리로드하는 리소스 낭비 notify들을 방지하기 위함

사용방법

override fun onBindViewHolder(holder: ItemViewHolder, position: Int, payloads: MutableList<Any>) {
    if (payloads.isEmpty()) {
      super.onBindViewHolder(holder, position, payloads)
    } else {
      if (payloads[0] == true) {
        holder.bindFavoriteState(getItem(position).isFavorite)
      }
    }
  }
}
override fun getChangePayload(oldItem: Item, newItem: Item): Any? {
    return if (oldItem.isFavorite != newItem.isFavorite) true else null
  }

전체 코드는 아래와 같다

class ItemAdapter(
  private val favoriteListener: (String, Boolean) -> Unit
) : ListAdapter<Item, ItemViewHolder>(ItemDiffCallback()) {
  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
    val binding = ItemCardBinding.inflate(
      LayoutInflater.from(parent.context),
      parent,
      false
    )
    return ItemViewHolder(binding, favoriteListener)
  }

  override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
    holder.bind(getItem(position))
  }

  override fun onBindViewHolder(holder: ItemViewHolder, position: Int, payloads: MutableList<Any>) {
    if (payloads.isEmpty()) {
      super.onBindViewHolder(holder, position, payloads)
    } else {
      if (payloads[0] == true) {
        holder.bindFavoriteState(getItem(position).isFavorite)
      }
    }
  }
}

class ItemViewHolder(
  private val binding: ItemCardBinding,
  private val favoriteListener: (String, Boolean) -> Unit
) : RecyclerView.ViewHolder(binding.root) {

  lateinit var item: Item

  init {
    binding.favoriteIcon.setOnClickListener {
      favoriteListener(item.id, !it.isSelected)
    }
  }

  fun bind(item: Item) {
    this.item = item

    binding.image.load(item.imageResId) {
      crossfade(true)
    }
    binding.title.text = item.title
    binding.description.text = item.description
    binding.favoriteIcon.isSelected = item.isFavorite
  }

  fun bindFavoriteState(isFavorite: Boolean) {
    binding.favoriteIcon.isSelected = isFavorite
  }
}

class ItemDiffCallback : DiffUtil.ItemCallback<Item>() {
  override fun areItemsTheSame(oldItem: Item, newItem: Item): Boolean {
    return oldItem.id == newItem.id
  }

  override fun areContentsTheSame(oldItem: Item, newItem: Item): Boolean {
    return oldItem == newItem
  }

  override fun getChangePayload(oldItem: Item, newItem: Item): Any? {
    return if (oldItem.isFavorite != newItem.isFavorite) true else null
  }
}
  • getChangePayload()는 areItemTheSame()은 true를 반환하고, areContentsTheSame()는 false를 반환할때 트리거가 된다.


Uploaded by N2T

'개발 > Android' 카테고리의 다른 글

Android useful kickass tools  (0) 2023.08.08
Dialog With Navigation  (0) 2023.08.08
Connectivity Manager  (0) 2023.07.28
AAC  (0) 2023.07.26
알아두면 좋은 Kotlin extension  (0) 2023.07.26