Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ListAdapter, DiffUtil을 활용해봅시다 #15

Open
wateralsie opened this issue Mar 4, 2023 · 0 comments
Open

ListAdapter, DiffUtil을 활용해봅시다 #15

wateralsie opened this issue Mar 4, 2023 · 0 comments
Assignees
Labels

Comments

@wateralsie
Copy link
Member

스밈 코드에서는 리사이클러뷰의 데이터를 구성하거나 변경하기 위해 아래 코드와 같이 써왔는데요,

fun setArchiveList(list: List<Archive>) {
     this.archiveList = list.toList()
     notifyDataSetChanged()
}  

이 중 notifyDataSetChanged()에서 이 주의사항을 본 적이 있을겁니다.

notifyDataSetChanged() 를 호출하면 어댑터에게 리사이클러뷰 데이터가 변경되었음을 알리고, 모든 항목을 업데이트하게 됩니다. 이때 어떤 데이터가 변경되었는지는 알려주지 않기 때문에 한 개의 항목이라도 바뀌면 ViewHolder 자체를 갈아끼우는데, 리사이클러뷰의 크기가 커질수록 비효율적이겠죠? 그리고 아이템에 삭제나 추가 애니메이션도 넣기 어렵다고 합니다. (변경된 순간 모든 아이템을 다시 불러오니 어쩌면 당연한 일)

그래서 DiffUtil과 우리가 피드백으로 받기도 한 ListAdapter의 도입을 제안하려고 합니다.

DiffUtil

DIffUtil은 두 리스트를 비교하고 차이를 계산해주는 유틸리티 클래스입니다. 리사이클러뷰는 이를 활용해 변경된 아이템만 업데이트를 해줄 수 있는데요, DiffUtil은 아이템 개수가 많아질수록 비교연산 시간이 길어지기 때문에 백그라운드 스레드에서 처리되어야 합니다.
직접 백그라운드 스레드에서 비교 처리를 수행하고 결과를 메인 스레드에서 처리하도록 구현하는 번거로움을 없애기 위해 보통 AsyncListDiffer를 사용합니다.

ListAdapter

위에서 말한 AsyncListDiffer를 사용하는 것보다 더 간단한 방법이 있는데, 바로 AsyncListDiffer를 내부적으로 사용하는 ListAdapter를 쓰는 것입니다. 일반 리사이클러뷰 어댑터랑 비교해보면 getItemCount()가 없는대신 아이템의 정보를 가져오는 getItem(position) 메서드가 있습니다.

이것도 참고하십쇼

https://developer.android.com/codelabs/kotlin-android-training-diffutil-databinding#0

@wateralsie wateralsie self-assigned this Mar 4, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant