DiffUtil 이 뭐야? 클릭리스너도 알려줘.

그리고 layout폴더 내에 폴더만들어서 정리하고싶은데

디렉터리는 생성해도 안보이네 뭐 만들어야 해?

 

 

✅ 1. DiffUtil이란? (RecyclerView 성능 향상 도구)

❓ 문제점:

RecyclerView에 새 데이터 리스트를 주면 adapter.notifyDataSetChanged()는 전체를 무식하게 다 다시 그림
→ 비효율적, 깜빡임 생김

✅ 해결책:

DiffUtil은 "어떤 아이템이 바뀌었는지" 똑똑하게 계산해서 최소한만 다시 그림

 

🛠 사용 예시:

🔹 1. DiffUtil.Callback 상속

class UserDiffCallback : DiffUtil.ItemCallback<User>() {
    override fun areItemsTheSame(oldItem: User, newItem: User): Boolean {
        return oldItem.name == newItem.name // 고유 기준
    }

    override fun areContentsTheSame(oldItem: User, newItem: User): Boolean {
        return oldItem == newItem // 내용이 같은지
    }
}

 

 

🔹 2. 어댑터에 연결

ListAdapter를 사용하면 자동 적용돼요:

class UserAdapter : ListAdapter<User, UserAdapter.UserViewHolder>(UserDiffCallback()) {
    ...
}

📌 submitList(newList)만 해주면 DiffUtil이 알아서 바뀐 것만 갱신해줌!

 

 

✅ 2. 클릭 리스너 구현 방법

RecyclerView에서 아이템 클릭하려면 Adapter에 리스너를 주입하면 돼요:

🔹 Adapter에 람다 전달

class UserAdapter(
    private val onClick: (User) -> Unit
) : ListAdapter<User, UserAdapter.UserViewHolder>(UserDiffCallback()) {

    inner class UserViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val textName: TextView = itemView.findViewById(R.id.textName)
        private val textAge: TextView = itemView.findViewById(R.id.textAge)

        fun bind(user: User) {
            textName.text = user.name
            textAge.text = "${user.age}살"

            itemView.setOnClickListener {
                onClick(user)
            }
        }
    }

    override fun onBindViewHolder(holder: UserViewHolder, position: Int) {
        holder.bind(getItem(position))
    }
}

 

 

🔹 Fragment에서 사용

val adapter = UserAdapter { user ->
    Toast.makeText(context, "${user.name} 클릭됨", Toast.LENGTH_SHORT).show()
}
recyclerView.adapter = adapter
adapter.submitList(users)
 
 

✅ 3. layout/ 폴더 안에 서브 폴더가 안 보이는 이유?

Android의 res/layout/ 안에는 서브 디렉터리를 만들 수 없습니다.
빌드 시 리소스 인식이 안 돼요.

📛 layout/item/item_user.xml ← 이런 건 작동 안 함!

 

✅ 추천 방식: 이름 규칙으로 구분

예시:
res/layout/
├── item_user.xml
├── item_product.xml
├── fragment_user_list.xml
├── activity_main.xml

 

  • item_ → RecyclerView 아이템
  • fragment_ → Fragment 전용
  • dialog_, view_, include_, activity_ 등으로 접두어만 잘 구분하세요!

 

🧠 요약

질문 핵심 요약
DiffUtil 리스트 변경 시 똑똑하게 변경 감지해서 필요한 것만 갱신
클릭 리스너 onClick: (User) -> Unit 람다를 Adapter에 전달
layout 하위 폴더 ❌ 불가능, 대신 파일명 접두어로 구분 (item_, fragment_ 등)
 

 

+ Recent posts