RecyclerView는 안드로이드 앱에서 목록을 표시할 때 자주 사용되는 유연한 뷰 구조입니다. 이 글에서는 RecyclerView를 사용할 때 선택할 수 있는 두 가지 어댑터 유형, 즉 기본 RecyclerView.Adapter와 확장된 ListAdapter에 대해 알아보겠습니다.
기본 RecyclerView.Adapter는 데이터를 관리하고 뷰 홀더를 바인딩하기 위한 기본 클래스입니다. RecyclerView.Adapter를 사용할 때 데이터 변경 사항을 처리하려면 아래와 같은 메서드를 수동으로 호출해야 합니다.
그 외의 다양한 notify 메서드들 또한 데이터 항목에 대한 동일성 및 내용 동일성을 수동으로 처리해야 합니다.
FoodListAdapter.kt
class FoodListAdapter(private val clickListener: FoodClickListener) :
RecyclerView.Adapter<FoodListAdapter.FoodListViewHolder>() {
private val foodList = mutableListOf<FoodResponse.Food>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FoodListViewHolder {
return FoodListViewHolder.from(parent)
}
override fun onBindViewHolder(holder: FoodListViewHolder, position: Int) {
holder.bind(foodList[position], clickListener)
}
override fun getItemCount(): Int {
return foodList.size
}
fun submitList(list: List<FoodResponse.Food>) {
foodList.clear()
foodList.addAll(list)
notifyDataSetChanged()
}
}
ListAdapter는 RecyclerView.Adapter를 확장한 것으로, 데이터 변경 사항을 자동으로 처리하는 추가 기능이 제공됩니다. ListAdapter는 내부적으로 AsyncListDiffer를 사용하여 백그라운드 스레드에서 효율적으로 목록의 차이를 계산하고 애니메이션을 자동으로 처리합니다.
ListAdapter를 사용하려면 DiffUtil.ItemCallback을 구현하여 동일성 및 내용 동일성을 처리해야 합니다. 이를 통해 데이터 변경 사항을 더 효율적으로 처리할 수 있습니다.
PostListAdapter.kt
class PostListAdapter(private val clickListener: PostClickListener) :
ListAdapter<Post, PostListAdapter.PostListViewHolder>(PostDiffUtil()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostListViewHolder {
return PostListViewHolder.from(parent)
}
override fun onBindViewHolder(holder: PostListViewHolder, position: Int) {
holder.bind(getItem(position), clickListener)
}
ListAdapter를 사용하면 데이터 변경 사항을 처리하는 코드를 작성할 필요가 없으며, 애니메이션 처리와 성능 최적화를 자동으로 수행합니다. 이로 인해 개발이 더 간편해집니다. 그러나 경우에 따라서는 RecyclerView.Adapter를 사용하여 더 많은 제어를 원할 수도 있습니다. 따라서 대부분의 경우, ListAdapter를 사용하는 것이 좋습니다.
결론적으로, 간단한 목록에는 ListAdapter를 사용하면 개발 과정이 더 간편하고 효율적입니다. 그러나 더 복잡한 상황이나 목록에 대한 더 많은 제어가 필요한 경우에는 RecyclerView.Adapter를 사용할 수 있습니다. 어댑터를 선택할 때 애플리케이션의 요구 사항과 개발 편의성을 고려하면 좋습니다.