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_ 등) |
'잡동사니 > GPT가 알려주는' 카테고리의 다른 글
[GPT가 알려주는] C드라이브 용량 부족할 때 WSL 배포판을 다른 드라이브(D:)로 이전하는 법 (0) | 2025.05.14 |
---|---|
[GPT가 알려주는] RecyclerView 의 Item 클릭 시 배경 색 변경 (0) | 2025.05.14 |
[GPT가 알려주는] Android - RecyclerView (0) | 2025.05.14 |
[GPT가 알려주는] Matter - Comissioner, Controller, Fabric (0) | 2025.05.13 |
[GPT가 알려주는] React useEffect, useState, useRef 란? (0) | 2025.04.28 |