Android Use a DiffUtil

사용 언어: Kotlin 1.8.10
사용 버전: 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


댓글

이 블로그의 인기 게시물

Python OpenCV 빈 화면 만들기

Python urllib.parse.quote()

Python bytes.fromhex()

Android AVD Ram size change

Forensics .pyc 파일 .py로 복구하기

Android Minimum touch target size

KiCad 시작하기 7 (FreeRoute 사용하기 2)

Android Notification with Full Screen

C++ OpenCV 모폴로지 침식, 팽창

KiCad 시작하기 2 (PCB 만들기)