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()
}