[TIL] ๐ผ24/04/13๐ผ#RecyclerView #payload #DiffUtil
- ์ค๋์ฌํ ๊ฐ๋ฐ ์ค RecyclerView์ ํญ๋ชฉ์ ๋กฑํด๋ฆญํ์ฌ ๋๋๊ทธ&๋๋กญํ์ฌ ์์ ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉฐ, ํญ๋ชฉ์ ์์๋ฅผ ํ์ํ๋ TextView๋ง์ ์๋ก bindingํ๊ธฐ ์ํด RecyclerView์ payload๋ฅผ ์ฌ์ฉํ ์ ์ด ์์๋ค.
- ์ค๋์, ์ด๋ฏธ์ง ๊ฒ์ ์ฑ์์ RecyclerView์ ํญ๋ชฉ์ ํด๋ฆญํ์ฌ ์ข์์/์ข์์ ์ทจ์ ๊ธฐ๋ฅ์ ๋ฆฌํฉํ ๋งํ๋ฉฐ, ํญ๋ชฉ ์ ์ฒด๋ฅผ ๋ค์ bindingํ๋ ๊ฒ์ด ์๋ ์ข์์ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ํํธ ๋ชจ์ ImageView๋ง์ ์๋ก bindingํ๊ณ ์ถ์ด์ ธ payload๋ฅผ ์ฌ์ฉํ๋ค.
- ์ด๋ฒ์๋ payload ํ๋ผ๋ฏธํฐ๋ก Any()๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ด ์๋, ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค!
๐์ฐธ๊ณ ์๋ฃ:
- RecyclerView์ ListAdpater์
submitList
๋ก ์๋ก์ด ๋ฐ์ดํฐ ์
์ ์ ๋ฌ
-> DiffUtil์์ getChangePayload
ํจ์๋ก payload ๋ฐํ
-> onBindViewHolder
์์ payload ์ข
๋ฅ์ ๋ฐ๋ผ ํ๋ binding ๊ฐ๋ฅ!
import androidx.recyclerview.widget.DiffUtil
import com.sparta.imagesearch.data.Item
sealed interface ItemChangePayload {
data class FolderIdChange(val folderId: String) : ItemChangePayload
}
object 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 when {
oldItem.folderId != newItem.folderId ->
ItemChangePayload.FolderIdChange(newItem.folderId)
else -> super.getChangePayload(oldItem, newItem)
}
}
}
override fun onBindViewHolder(holder: Holder, position: Int) {
holder.bind(currentList[position])
}
override fun onBindViewHolder(holder: Holder, position: Int, payloads: MutableList<Any>) {
when(val lastPayload = payloads.lastOrNull()){
is ItemChangePayload.FolderIdChange ->
holder.bindHeartImageView(lastPayload.folderId)
else -> super.onBindViewHolder(holder, position, payloads)
}
}