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