안드로이드/기타

[안드로이드] DiffUtil의 동일성과 동등성에 대한 이해

안드뽀개기 2022. 4. 8. 09:41
반응형

안드로이드의 RecyclerView를 사용할 때, DiffUtil을 사용하여 성능을 개선할 수 있는데, 

그 원리에 대해 설명하고자 포스팅합니다.

 


 

 

가장 처음 RecyclerView를 구현하기 위해서 Adapter를 구현하고 RecyclerView와 연결지어줍니다.

그리고 보통 데이터를 화면에 뿌려주기 위해서 adapter.notifyDataSetChanged()를 호출합니다.

 

하지만, 리스트 중에 아이템 하나만 변경이 되었을 때에도 notifyDataSetChanged()를 호출하여 리스트를

업데이트 하는 방식은 퍼포먼스를 저하시킵니다. 

 

이를 방지 하기 위해서

notifyItemChange(position), notifyItemRemoved(position), notifyItemInserted(position) 

등의 함수를 제공하지만, ListAdapter를 상속하여 Adapter를 구현하면, 위의 함수들은 사용할 필요가 없습니다.

 

하나로 어떤 하나의 아이템에 대해  데이터의 수정, 삭제, 삽입 등이 일어났을 때,

submistList(list) 함수만 호출해주면 하나의 아이템만을 업데이트 할 수 있습니다.

 

이를 위해서는  DiffUtil 클래스에 대해 알아야 하는데,

DiffUtil 클래스는 submitList(list)가 호출되었을때,  각 아이템들의 동일성과 동등성을 확인하여 리스트를 업데이트합니다.

 




areItemsTheSame(oldItem: UserInfo, newItem: UserInfo)

: areItemsTheSame를 override하여 동일성을 검사합니다. oldItem과 newItem의 고유값을 비교하여, 두 아이템이 동일한 아이템인지를 확인하여 동일하면 true, 동일하지 않으면 false를 리턴합니다. 여기서 true를 리턴하면 areItemContentsTheSame(oldItem: UserInfo, newItem: UserInfo)을 호출합니다.

override fun areItemsTheSame(oldItem: UserInfo, newItem: UserInfo): Boolean {
    return oldItem.id == newItem.id
}

areItemContentsTheSame(oldItem: UserInfo, newItem: UserInfo)

: areItemContentsTheSame을 override하여 동등성을 검사합니다. oldItem과 newItem의 equals를 통해 모든 필드를 검사하고 false를 반환하면 데이터를 갱신합니다.

override fun areContentsTheSame(oldItem: UserInfo, newItem: UserInfo): Boolean {
    return oldItem == newItem
}
반응형