기본적으로 RecyclerView를 사용하기 위해서는 Adapter, LayoutManager, ViewHolder가 필요한데 Adapter는 데이터 리스트를 실제 눈으로 볼 수 있게 item으로 변환하는 중간다리 역할을 한다.
기존에 notifyDataSetChanged()
를 통해 데이터를 업데이트하면 조금만 바뀌어도 나머지 데이터도 모두 업데이트되는 불필요함이 있었는데 ListAdapter를 사용하게되면 백그라운드 스레드에서 DiffUtil
를 통해 불필요한 교체 비용을 줄일 수 있다.
DiffUtil
RecyclerView의 성능을 개선할 수 있게 해주는 유틸리티 클래스로 현제 데이터 리스트와 교체될 리스트를 비교해서 무엇이 바뀌었는지 비교해서 바뀐 부분의 데이터만 바꿔준다.
AsyncListDiffer
DiffUtil을 더 편리하게 사용할 수 있게 해주는 클래스다. 백그라운드 스레드에서 처리하도록 지원해주며 AsyncListDiffer의 submitlist 메서드를 통해 이 모든과정이 처리된다.
아이템을 비교하기 위한 DiffUtil.ItemCallback을 구현한다.
areItemsTheSame()
: oldItem과 newItem이 동일한지 확인하는데 item을 구분할 수 있는 값을 사용한다.
areContentsTheSame()
: areItemsTheSame()
이 true일때 호출되며, oldItem과 newitem이 같은 데이터를 포함하는지 확인하는데 데이터 클래스의 모든 필드를 비교한다. 두 아이템 사이에 차이점이 있는경우 DiffUtil
에 업데이트 되었다고 알려준다.
Adapter 내부에 getItemCount()
, submitList()
등 원하는 메소드를 사용한다.
getItemCount()
: protected method로 클래스 내부에서 사용하고 ListAdapter + Diffutil에서는 리스트의 아이템을 가져오는데 사용된다.
submitList()
: 일반 어댑터의 add(), notifyDataSetChanged() 대신 사용하고 리스트를 변경할 때 사용한다.