DiffUtil?
안드로이드를 처음 공부할 때 리사이클러뷰의 아이템을 업데이트하기 위해 notifyDataSetChanged()
를 사용하였다.
하지만 notifyDataSetChanged()는 리사이클러뷰 전체를 업데이트하는 방식으로 성능상의 손해가 발생
한다는 것을 알게 되었다.
DiffUtil
은 notifyDataSetChanged()을 대체할 수 있는 기능으로 리사이클러뷰의 아이템이 변경되면 변경된 부분을 확인 후 그 부분만을 변경해준다.
DiffUtilCallback 클래스 생성하기
class DiffUtilCallback(
private val oldList: List<Any>,
private val newList: List<Any>
) : DiffUtil.Callback() {
override fun getOldListSize(): Int = oldList.size
override fun getNewListSize(): Int = newList.size
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
val oldItem = oldList[oldItemPosition]
val newItem = newList[newItemPosition]
return if (oldItem is MemoEntity && newItem is MemoEntity) {
oldItem.id == newItem.id
} else {
false
}
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
oldList[oldItemPosition] == newList[newItemPosition]
}
리사이클러뷰 Adapter의 아이템 리스트 업데이트 메소드에서 사용하기
fun setData(memo: List<MemoEntity>) {
memo.let {
val diffCallback = DiffUtilCallback(memoList, memo)
val diffResult = DiffUtil.calculateDiff(diffCallback)
memoList.run {
clear()
addAll(memo)
diffResult.dispatchUpdatesTo(this@Adapter)
}
}
}