본문 바로가기
안드로이드 공부 & 앱

[안드로이드/Kotlin] DiffUtill + RecyclerView 개념 정리 및 Tip

by 문톰 2022. 5. 14.

1.DiffUtil의 사용배경

1-1)기존 NotifyDataSetChanged의 단점

-기존의 NotifyDataSetChanged를 사용해서 데이터를 갱신하면 전체 아이템을 다시 바인딩하는 방식으로 

되어있어서 수정되지 않은 아이템도 다시 갱신되어지는 단점이 있습니다.

 

1-2)DiffUtil의 장점

-DiffUtil을 사용하면 수정이된 아이템만 갱신시켜서 불필요한 리소스를 줄일 수 있다는 장점이 있습니다.

-DiffUtil은 이전 데이터 상태와 현재 데이터간의 상태 차이를 계산해서 반드시 업데이트해야 할 최소한의 

데이터만 갱신시킵니다.

 

2.DiffUtil 사용방법

2.DiffUtil 구현 Tip

1)DiffCallBack

-DiffUtil을 사용하기 위해선 이전데이터와 현재 데이터간의 비교를 해주는 클래스가 필요합니다.

//모든 아이템을 상속하는 BaseData를 사용해 아이템을 비교
internal open class BaseDiffCallback<T : BaseData> : DiffUtil.ItemCallback<T>() {
    //ItemId로 같은 객체인지 확인
    override fun areItemsTheSame(oldItem: T, newItem: T): Boolean {
        return oldItem.idx == newItem.idx
    }

    //두 아이템이 같은 데이터를 갖고있는지 확인
    override fun areContentsTheSame(oldItem: T, newItem: T): Boolean {
        return oldItem.hashCode() == newItem.hashCode()
    }
}

1-2)핵심 메서드 설명

areItemsTheSame(int oldItemPosition, int newItemPosition): Boolean

-두 아이템이 갖은 객체인지의 대한 여부를 True, False로 반환

 

areContentsTheSame(int oldItemPosition, int newItemPosition): Boolean

-두 아이템이 같은 데이터를 갖고 있는지 여부를 반환한다. areItemsTheSame()  true 를 반환할 때만 호출된다. 애초에 객체가 다르다면 데이터를 비교하는 것은 의미가 없기 때문이다.

 

 

2)Adapter

-리사이클러뷰 어댑터의 기존에 상속되었던 RecyclerView를 지우고 ListAdapter를 상속받습니다.

그리고 파라미터에 만들어놓은 DiffCallBack을 넣습니다.

 

3)Data

-비교할 아이템의 클래스입니다.

모든 데이터에 부모클래스

 

3-1)BaseData 클래스를 만든이유(Tip)

-DiffCallBack클래스를 만들 때 비교할 아이템 객체를 위의 그림처럼 객체별로 따로따로 넣는다면 새로운 아이템을 사용할 때마다 DiffCallBack 클래스를 새로 만들어야 한다는 단점이 있습니다.

 

-그래서 모든 아이템을 상속하는 부모 추상클래스를 만들어서 공통적으로 갖고있는 변수인 idx를 사용해 아이템의 차이를 비교하도록 했습니다.

-이렇게 하면 불필요하게 DiffCallBack 클래스를 만들 필요가 없어집니다.

 

4)SubmitList

-DiffUtil을 사용하면 별도로 리사이클러뷰 아이템 List를 생성할 필요가 없습니다.

-서버에서 응답 값으로 List를 받아오고 submitList에 받아온 List를 넣어주면 리사이클러뷰에서 넣어준 리스트를

사용해 값을 갱신합니다.

 

   -submitList에 넣은 리스트를 다시 사용하고 싶을 때는 currenList를 사용해 넣어준 리스트를 반환 받을 수 있습니다.

댓글