Android - RecyclerView에서 클릭 이벤트를 전달하기
2024. 7. 18. 10:33ㆍ[개발]/Kotlin 활용 앱 개발
### RecyclerView에서 클릭 이벤트를 전달하기 ###
#1. 인터페이스 방식
#2. 람다 방식
# 인터페이스(Interface) 방식
<인터페이스란?>
- 클래스가 구현해야 하는 메서드들의 집합을 정의하는 툴
- 구현을 포함하지 않고 어떤 동작을 해야 하는지 명시만 함
- 여러 클래스에서 공통됭 동작을 강제하기 위해 사용
- 구현할 메서드를 명시해 클래스가 특정 기능을 반드시 구현하게 함
- 재사용성이 좋음 / 코드의 유연성과 확장성 향상
// 인터페이스 구현
interface OnItemClickListener {
fun onItemClick(position: Int)
}
class MyAdapter(private val itemList: List<String>) :
RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
val itemClickListener: OnItemClickListener?
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView.findViewById(R.id.textView)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
return MyViewHolder(view)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.textView.text = itemList[position]
holder.itemView.setOnClickListener {
itemClickListener?.onItemClick(position)
}
}
override fun getItemCount(): Int {
return itemList.size
}
}
//MainActivity.kt
val adapter = MyAdapter(myItemList)
// object로 인터페이스 구현부를 작성
adapter.itemClickListener = object : OnItemClickListener {
override fun onItemClick(position: Int) {
// 클릭 이벤트 처리
Toast.makeText(this@MainActivity, "Item $position clicked", Toast.LENGTH_SHORT).show()
}
}
# 람다 방식
- 익명 함수로, 일종의 함수 표현식
- 이름이 없는 이유: 한 번 쓰고 버릴 거라서
- 아주 간단한 동작을 아주 가볍게 쓸 용도로 사용
- 코드 블록을 변수처럼 전달
- 코드가 간결해지고 함수나 메서드로 전달 가능
// 람다함수: private val itemClickListener: (Int) -> Unit)
// 임시 이름 = itemClickListener
// 인풋 자료형 = Int, 아웃풋 자료형 = Unit
class MyAdapter(private val itemList: List<String>, private val itemClickListener: (Int) -> Unit) :
RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView.findViewById(R.id.textView)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
return MyViewHolder(view)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.textView.text = itemList[position]
holder.itemView.setOnClickListener {
itemClickListener(position)
}
}
override fun getItemCount(): Int {
return itemList.size
}
}
//MainActivity.kt
// 람다함수: 아래 { position -> } 부분
val adapter = MyAdapter(myItemList) { position ->
// 클릭 이벤트 처리
Toast.makeText(this@MainActivity, "Item $position clicked", Toast.LENGTH_SHORT).show()
}
'[개발] > Kotlin 활용 앱 개발' 카테고리의 다른 글
Android - ViewPager2 / TabLayout (0) | 2024.07.18 |
---|---|
Android - RecyclerView에서의 ListAdapter 활용 (0) | 2024.07.18 |
Android - 알림(Notification) (0) | 2024.07.17 |
Android - 다이얼로그(Dialog) (0) | 2024.07.17 |
Android - Fragment (1) | 2024.07.16 |