본문 바로가기
Kotlin

[Kotlin] DiffUtil과 ListAdapter

by 명훈스토리 2023. 3. 6.
SMALL

개요

RecyclerView에서 쓰이는 DiffUtil과 ListAdapter에 대해 소개하겠습니다.

 

내용

안드로이드 RecyclerView에서 DiffUtil과 ListAdapter은 다음과 같은 기능을 제공합니다:

  • DiffUtil: 이전 데이터와 새로운 데이터를 비교하여 변경된 항목을 찾아내고, RecyclerView에 반영될 수 있도록 합니다. 이를 통해 UI 스레드에서의 끊김 없는 스크롤링을 보장합니다.
  • ListAdapter: DiffUtil을 자동으로 호출하여 데이터 변경을 처리하며, 데이터 모델에 따라 ViewHolder를 생성합니다. 이를 통해 코드를 간소화하고, 데이터 변경에 대한 처리를 단순화할 수 있습니다.

 

 원래는 RecyclerView의 아이템을 갱신하려면 notifyDataSetChanged()를 써야 했는데 이는 10개의 아이템 중 1개를 remove하거나 insert할 때 10개 아이템 모두 갱신하게 된다. notifyItemChange로 1개의 아이템을 갱신시킬 수 있지만 매번 해당 메소드를 써야 하는 번거로움이 있다.

 

 따라서 RecyclerView에 DiffUtil과 ListAdapter를 사용해 이러한 번거로움을 예방할 수 있다. 또한, ItemTouchHelper.Callback 인터페이스로 터치 이벤트로 아이템 삭제, 이동 등을 시킬 수 있다. 예를 들어 내가 보고 싶은 카테고리 순서를 편집하거나 원하는 키워드를 내 정보에 드래그하여 넣을 수 있는 등의 동작을 구현할 수 있다. 준비물은 다음과 같다.

 

준비물

  • RecyclerView
  • ListAdapter를 상속한 아답터 클래스
  • DiffUtil
  • 터치 이벤트를 제어할 ItemTouchHelper.Callback

아래와 같이 동작시킬 수 있습니다. 소스 샘플은 github 링크를 남겨두겠습니다.

 

 위와 같은 리사이클러뷰는 지마켓 메인 홈 키워드 순서 편집 기능에서 본 적이 있습니다. 처음 지마켓 UI를 봤을 때는 리사이클러뷰에 그리드 레이아웃을 세팅하고 아이템마다 터치 리스너를 주어서 각각의 아이템 position마다 얼마만큼 이동했는지에 따라 리사이클러뷰를 갱신해야 할지 생각했는데 DiffUtil, ListAdapter, ItemTouchHelper로 RecyclerView를 최적화하고 데이터의 비교를 백그라운드 스레드에서 수행하도록 하여 UI 스레드의 부담을 덜어주기까지 했습니다.

 우연히 DiffUtil과 ListAdapter에 대해 공부할까 싶어 찾아봤는데 얻어 걸리긴 했지만 추후에 네이티브로 순서 편집이나 데이터 삽입과 같은 UI 동작을 구현할 수 있을 것 같습니다.

 

Github Repo URL : https://github.com/dla3946gns/DiffUtil-And-ListAdapter

LIST

댓글