RecyclerView 성능 향상을 위한 DiffUtil

dada·2022년 1월 24일
0

Android

목록 보기
2/4
post-custom-banner

Reyclerview에서 데이터를 업데이트 하기 위해 주로 notifyItemChanged를 사용하는데, 이번에는 DiffUtil를 이용하여 바뀐 데이터만 업데이트 해주는 방식을 알아보려고 합니다🐥🐥

DiffUtil이란?

  • DiffUtill 은 두 목록의 차이를 계산하고 old item에서 new Item으로 목록이 변환할 때 업데이트되는 작업 목록을 출력하는 유틸리티 클래스
  • 하나의 목록을 다른 목록으로 변환하기 위한 최소의 업데이트 수를 계산

👉🏻RecyclerView의 notifyItemChanged

RecyclerView가 갖고 있는 Item이 변하게 되면 notifyItemChanged로 알려줘야 함.
하지만 위 메소드는 adapter가 새로운 item 인스턴스를 만들도록하기 때문에 비용이 많이 들음.

DiffUtil의 구성

areItemsTheSame( oldPosition:Int , newPosition:Int) : 두 객체가 동일한 항목을 나타내는지 확인
getOldListSize() : 바뀌 기 전 리스트의 크기를 리턴
getNewListSize() : 바뀐 후 리스트의 크기를 리턴
areContentsTheSame( oldPosition:Int, newPosition:Int) : 두 항목의 데이터가 같은지 확인

👉🏻oldItem과 newItem은 CovidData data class 타입을 가지고 있고 

같은 아이템인지 확인하기 위해 두 아이템의 고유 ID를 확인한다.

*비 추상 메소드

getChangePayload(oldPosition:Int , newPosition:Int) 
areItemsTheSame == true && areContentsTheSame==false일 경우에 호출

성능

DiffUtil은 두 목록 간의 추가 및 제거 작업의 최소 수를 찾기 위해 O(N) 공간이 필요하다.

예상되는 성능은 O(N + D²)입니다.

  • N: 추가 및 제거 된 항목의 총 수
  • D: 스크립트 길이

Reference

https://onemask514.tistory.com/48

https://developer.android.com/reference/android/support/v7/util/DiffUtil.html

profile
기록하기
post-custom-banner

0개의 댓글