Android Use a DiffUtil
사용 언어: Kotlin 1.8.10
사용 버전: Android Studio Flamingo 2022.2.1 Patch 1
DiffUtil은 두 개의 List를 비교하여 다른 것이 있는지 찾고 업데이트를 하는 기능을 합니다.
보통 RecyclerView Adapter에 많이 사용합니다.
리스트가 크다면, Main thread에서 사용하지 말고, Background에서 실행하고 DiffResult를 받으라고 권고합니다.
아래는 DiffUtil 문서입니다.
https://developer.android.com/reference/androidx/recyclerview/widget/DiffUtil
사용 버전: Android Studio Flamingo 2022.2.1 Patch 1
안드로이드 Use a DiffUtil을 알아보겠습니다.
DiffUtil은 두 개의 List를 비교하여 다른 것이 있는지 찾고 업데이트를 하는 기능을 합니다.
보통 RecyclerView Adapter에 많이 사용합니다.
리스트가 크다면, Main thread에서 사용하지 말고, Background에서 실행하고 DiffResult를 받으라고 권고합니다.
아래는 DiffUtil 문서입니다.
https://developer.android.com/reference/androidx/recyclerview/widget/DiffUtil
원래는 RecyclerView Adapter에 DiffUtil.ItemCallback()만 사용하면 충분한데요.
지금 알 수 없는 버그가 발생해서 그냥 DiffUtil.Callback()을 사용하기로
했습니다.
DiffUtil.ItemCallback의 사용법은 RecyclerView 게시글을 보시면 됩니다.
이러한 DiffUtil.ItemCallback()을 사용했습니다.
이걸 DiffUtil.Callback()으로 변경할 겁니다.
여기서 47 번째 줄의 MultipleCounterRecyclerViewDiffCallback()을 지웁니다.
그리고, 46 번째 줄의 ListAdapter를 RecyclerView.Adapter로 변경합니다.
49 번째 줄처럼 내부 data를 나타내는 내부 리스트를 하나 만듭니다.
저는 groupCounterDataItem으로 만들었습니다.
추가적으로 getItemCount()를 override 합니다.
groupCounterDataItem.size를 return 합니다.
기존에 getItem을 사용하던 곳은 변경이 필요합니다.
위에서 만든 groupCounterDataItem[position]을 이용합니다.
DiffUtil.Callback()을 상속받는 class를 하나 만듭니다.
저는 MultipleCounterRecyclerViewDiffCallback()으로 만들었습니다.
내부에는 oldList와 newList를 인자로 받습니다.
getOldListSize, getNewListSize, areItemsTheSame, areContentsTheSame을
override 합니다.
size를 return 하고 item과 content를 비교하면 끝입니다.
submitList라는 함수를 만들어줍니다.
76 번째 줄처럼 여기에 위에서 만든 DiffUtil을 불러옵니다.
79번째 줄처럼 DiffUtil.calculateDiff()로 차이를 계산합니다.
81번째 줄처럼 groupCounterDataItem을 최신화 시킵니다.
82 번째 줄처럼 dispatchUpdatesTo()를 사용하여 adapter에 변경 사항을
적용합니다.
자, 완성입니다.
이렇게 하면 되는데.... 그대로 버그가 나오네요?
찾아보니 데이터베이스를 잘못 건드려서 발생한 버그였네요.
끝.
카테고리: Android
댓글
댓글 쓰기
궁금한 점은 댓글 달아주세요.
Comment if you have any questions.