RecyclerView 클릭 이벤트
RecyclerView에서 항목 클릭과 길게 누르기를 처리하고, 클릭 리스너를 어댑터에 전달하며, 항목을 탭하면 상세 화면으로 이동합니다.
RecyclerView 클릭 이벤트은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 6개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 6개의 강의가 포함되어 있습니다.
리스트 항목을 클릭할 수 있게 만들기
RecyclerView에는 ListView와 같은 기본 클릭 리스너가 없습니다. 어댑터 내부에 클릭 리스너를 추가해야 합니다.
권장 패턴은 람다(콜백)를 어댑터 생성자에 전달하는 것입니다. 항목을 탭하면 어댑터가 선택한 항목과 함께 람다를 호출하고, Activity가 다음 동작을 처리합니다.
클릭 콜백이 있는 어댑터
어댑터에 onItemClick 람다 매개변수를 추가합니다.
class FruitAdapter(
private val fruits: List<Fruit>,
private val onItemClick: (Fruit) -> Unit
) : RecyclerView.Adapter<FruitAdapter.ViewHolder>() {
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val tvName: TextView = view.findViewById(R.id.tvName)
val tvCalories: TextView = view.findViewById(R.id.tvCalories)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_fruit, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val fruit = fruits[position]
holder.tvName.text = fruit.name
holder.tvCalories.text = "${fruit.calories} kcal"
// Set click listener on the whole item
holder.itemView.setOnClickListener {
onItemClick(fruit)
}
}
override fun getItemCount() = fruits.size
}Activity에서 클릭 처리하기
Activity에서 세부 화면으로 이동하는 람다를 전달합니다.
val adapter = FruitAdapter(fruits) { fruit ->
// Called when user taps a fruit
val intent = Intent(this, FruitDetailActivity::class.java)
intent.putExtra("FRUIT_NAME", fruit.name)
intent.putExtra("FRUIT_CALORIES", fruit.calories)
startActivity(intent)
}
binding.recyclerView.apply {
this.adapter = adapter
layoutManager = LinearLayoutManager(this@MainActivity)
}세부 화면에서 데이터 받기
세부 Activity에서 추가 데이터를 읽습니다.
class FruitDetailActivity : AppCompatActivity() {
private lateinit var binding: ActivityFruitDetailBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityFruitDetailBinding.inflate(layoutInflater)
setContentView(binding.root)
val name = intent.getStringExtra("FRUIT_NAME") ?: "Unknown"
val calories = intent.getIntExtra("FRUIT_CALORIES", 0)
binding.tvDetailName.text = name
binding.tvDetailCalories.text = "$calories kcal"
}
}효율적인 업데이트를 위한 DiffUtil
리스트 데이터가 변경되었을 때 notifyDataSetChanged()를 호출하지 마세요. 모든 항목을 다시 그리기 때문입니다. 대신 DiffUtil을 사용합니다.
- 이전 리스트와 새 리스트의 최소 변경 사항을 계산합니다.
- 변경된 항목만 애니메이션으로 표시합니다.
- 성능과 사용자 경험이 향상됩니다.
최신 방식은 DiffUtil을 자동으로 사용하는 ListAdapter입니다.
DiffUtil을 사용하는 ListAdapter
자동으로 애니메이션이 적용되는 리스트 업데이트를 위해 ListAdapter를 상속합니다.
class FruitAdapter(
private val onItemClick: (Fruit) -> Unit
) : ListAdapter<Fruit, FruitAdapter.ViewHolder>(DIFF_CALLBACK) {
companion object {
val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Fruit>() {
override fun areItemsTheSame(old: Fruit, new: Fruit) =
old.name == new.name
override fun areContentsTheSame(old: Fruit, new: Fruit) =
old == new // data class equals()
}
}
// ... ViewHolder and onCreateViewHolder same as before ...
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val fruit = getItem(position) // use getItem(), not fruits[position]
holder.tvName.text = fruit.name
holder.itemView.setOnClickListener { onItemClick(fruit) }
}
}새 리스트 제출하기
ListAdapter에서는 submitList()를 호출하여 리스트를 업데이트합니다. DiffUtil이 애니메이션을 자동으로 처리합니다.
// In Activity:
val adapter = FruitAdapter { fruit ->
// handle click
}
binding.recyclerView.adapter = adapter
// Initial data
adapter.submitList(fruits)
// Later, update with new data (e.g. after filtering):
val filtered = fruits.filter { it.calories < 100 }
adapter.submitList(filtered) // DiffUtil animates the change길게 누르기와 컨텍스트 메뉴
onBindViewHolder에서 setOnLongClickListener를 설정하여 길게 누르기에 응답할 수도 있습니다.
- 이벤트를 소비하려면 리스너에서
true를 반환합니다. - 삭제 또는 수정 대화상자를 표시하는 데 사용할 수 있습니다.
- 또는
ItemTouchHelper로 밀어서 삭제하는 기능을 구현할 수 있습니다.
항목 구분선 추가하기
DividerItemDecoration으로 리스트 항목 사이를 시각적으로 구분합니다.
binding.recyclerView.apply {
adapter = fruitAdapter
layoutManager = LinearLayoutManager(this@MainActivity)
addItemDecoration(
DividerItemDecoration(
this@MainActivity,
DividerItemDecoration.VERTICAL
)
)
}빠른 확인
RecyclerView 어댑터에서 항목 클릭을 처리하는 권장 방법은 무엇인가요?
복습: RecyclerView 클릭
이제 상호작용이 가능한 리스트를 만들 수 있습니다.
- 람다 콜백을 어댑터 생성자에 전달합니다.
onBindViewHolder에서holder.itemView.setOnClickListener를 호출합니다.- Intent를 통해 추가 데이터를 전달하여 세부 화면으로 이동합니다.
- 부드럽고 애니메이션이 적용된 업데이트에는
ListAdapter와DiffUtil을 사용합니다. submitList()를 호출하여 표시되는 데이터를 업데이트합니다.
다음: SharedPreferences로 데이터를 로컬에 저장합니다.
자주 묻는 질문
“RecyclerView 클릭 이벤트” 강의는 무료인가요?
네 — “RecyclerView 클릭 이벤트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 6개의 강의가 포함되어 있습니다.
“RecyclerView 클릭 이벤트”에서 뭘 배우나요?
RecyclerView에서 항목 클릭과 길게 누르기를 처리하고, 클릭 리스너를 어댑터에 전달하며, 항목을 탭하면 상세 화면으로 이동합니다. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Android Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 6개 중 3번째 강의입니다.
“RecyclerView 클릭 이벤트” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Kotlin 컬렉션
- RecyclerView 기초
- RecyclerView 클릭 이벤트
- SharedPreferences
- DataStore 환경 설정
- 어댑터와 DiffUtil