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를 사용해 넣어준 리스트를 반환 받을 수 있습니다.
'안드로이드 공부 & 앱' 카테고리의 다른 글
안드로이드 인앱 시스템 구축[1편] 앱 소유자(Owner) 권한 얻기 (0) | 2023.07.28 |
---|---|
[안드로이드/Kotlin] 의존성 주입 및 Hilt 프레임워크 사용 과정 (0) | 2022.05.17 |
안드로이드 CleanArchitecture 개념 정리 및 구현 (0) | 2022.04.21 |
[안드로이드] JetPack Navigation 개념 정리 및 예제 (0) | 2022.04.16 |
[안드로이드] 버튼 클릭 리스너로 확인하는 옵저버 패턴-1편 (0) | 2022.04.13 |
댓글