ListAdapter
간단하게 설명하면 DiffUtil 유틸 클래스를 활용해서 아이템 업데이트를 할수 있는 기능을 추가한 Adapter 이다.
- AsyncListDiffer 를 더 쓰기 편하도록 랩핑한 클래스이다.
- RecyclerView.Adapter 가 ListAdapter 를 상속하게 하고, 초기화 시 DiffUtil 콜백 객체를 넘겨준다.
- submitList() 로 전체 데이터를 넘겨주면 adapter 가 백그라운드 스레드를 사용해 리스트 차이를 계산하여 화면을 갱신한다.
위 설명을 보면 왜 ListAdapter 가 RecyclerView 를 사용하는 것보다 효율적이라는 게 이해가 안될 수 있다.
https://devnuts.tistory.com/205
위 블로그를 한 번 보고 오면 좀 더 이해가 쉬울 것이다.
ListAdapter 사용방법
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}#end
import android.support.v7.recyclerview.extensions.ListAdapter
import android.support.v7.util.DiffUtil
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
class ${NAME} : ListAdapter<${Model_Class}, ${NAME}.ItemViewholder>(DiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewholder {
return ItemViewholder(
LayoutInflater.from(parent.context)
.inflate(R.layout.${Item_Layout_ID}, parent, false)
)
}
override fun onBindViewHolder(holder: ${NAME}.ItemViewholder, position: Int) {
holder.bind(getItem(position))
}
class ItemViewholder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(item: ${Model_Class}) = with(itemView) {
// TODO: Bind the data with View
setOnClickListener {
// TODO: Handle on click
}
}
}
}
class DiffCallback : DiffUtil.ItemCallback<${Model_Class}>() {
override fun areItemsTheSame(oldItem: ${Model_Class}?, newItem: ${Model_Class}?): Boolean {
return oldItem?.id == newItem?.id
}
override fun areContentsTheSame(oldItem: ${Model_Class}?, newItem: ${Model_Class}?): Boolean {
return oldItem == newItem
}
}
'Mobile App' 카테고리의 다른 글
[안드로이드] - MVC 패턴과 안드로이드 MVC 패턴 (0) | 2023.02.15 |
---|---|
[안드로이드] MVVM 패턴과 안드로이드 MVVM 패턴 (0) | 2023.02.11 |
[안드로이드] - DiffUtil 이란? (+AsyncListDiffer) (0) | 2023.02.02 |
[안드로이드] - 클린아키텍처 - 3 (0) | 2023.02.01 |
[안드로이드] - 클린아키텍처 - 2 (3) | 2023.02.01 |