본문 바로가기
Mobile App

[안드로이드] - ListAdapter

by Jman 2023. 2. 2.

ListAdapter

간단하게 설명하면 DiffUtil 유틸 클래스를 활용해서 아이템 업데이트를 할수 있는 기능을 추가한 Adapter 이다.
  • AsyncListDiffer 를 더 쓰기 편하도록 랩핑한 클래스이다.
  • RecyclerView.Adapter 가 ListAdapter 를 상속하게 하고, 초기화 시 DiffUtil 콜백 객체를 넘겨준다.
  • submitList() 로 전체 데이터를 넘겨주면 adapter 가 백그라운드 스레드를 사용해 리스트 차이를 계산하여 화면을 갱신한다.

위 설명을 보면 왜 ListAdapter 가 RecyclerView 를 사용하는 것보다 효율적이라는 게 이해가 안될 수 있다.

https://devnuts.tistory.com/205

 

[안드로이드] - DiffUtil 이란? (+AsyncListDiffer)

왜 DiffUtil 를 알아보는거야? 우리는 RecyclerView 를 사용할 때 RecyclerView.Adpater 에 notify 변경 메소드로 알려 아이템 변경을 감지하고 갱신할 수 있다는 것을 알고 있다. 보통 아이템 업데이트가 필요

devnuts.tistory.com

위 블로그를 한 번 보고 오면 좀 더 이해가 쉬울 것이다.

 

 

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
    }
}