DiffUtil 사용방법

pnlkc·2022년 5월 31일
0
post-thumbnail
post-custom-banner

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)
            }
        }
    }
profile
안드로이드 개발 공부 블로그
post-custom-banner

0개의 댓글