DiffUtil로 RecyclerView효율화하기

2023. 5. 3. 16:22개발/Android

최근에 recyclerview를 만지다보니.. diffutil을 조금 더 찾아보는 계기가 되었다. 

사실 크게 관심은 없고 다들 그렇게 사용하니 사용하다가 .. ㅎㅎ

 

DiffUtil이란?

  • 리스트를 업데이트하는 유틸리티 클래스. RecyclerView 어댑터의 업데이트를 계산하는 데 사용된다
  • 리스트에 변경된 부분만을 감지하여 갱신시켜주는 것!
  • 예상 시간은 O(N + D^2)
class StudentAdapter : ListAdapter<Student, StudentAdapter.ViewHolder>(StudentCallback()) {

    inner class ViewHolder(private val itemView: View) : RecyclerView.ViewHolder(itemView){
        ........
        ........
    }

    class StudentCallback : ItemCallback<Student>(){
        override fun areItemsTheSame(oldItem: Student, newItem: Student): Boolean {
            return oldItem.studentId == newItem.studentId
        }

        override fun areContentsTheSame(oldItem: Student, newItem: Student): Boolean {
            return oldItem == newItem
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.student_item, parent, false))
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        ......
        ......
    }
}
data class Student(
    val studentId: Int,
    val name: String,
    val marks: Int
)

→ areItemsTheSame의 경우, oldItem = Student(1, “도일”, 50), newItem = Student(1, “도일”, 60)이면 true 반환됨

areTheContentsTheSame은 모두 같은 값일때만 true를 반환

 

 

 

 

contents의 변형을 감지했다면 아래와 같이

studentAdapter.submitList(newList)