Android/RecyclerView

[Android] RecyclerView 클릭 이벤트 처리하기

O_Gyong 2022. 11. 2.

RecyclerView의 Item을 클릭할 때 intent나 api 호출 등을 Adapter에서 처리한다고 번거로웠던 적이 있다.

이럴 때 interface를 통해 Activity나 Fragment에서 클릭 이벤트를 처리할 수 있다.

 

1. Interface 생성
2. Adapter에서 Interface에 대한 객체를 생성 및 초기화
3. Activity 또는 Fragment에서 override 하여 사용

예제로 아이템을 클릭했을 때 해당 아이템의 텍스트를 토스트로 띄워보려고 한다.


인터페이스 생성

interface SetOnClickListenerInterface {
    fun listItemClickListener(itemData: String, binding: ItemListMainBinding)
}

리스트를 클릭했을 때 필요한 데이터가 파라미터로 전달될 수 있도록 인터페이스를 작성한다.


인터페이스 객체 생성 및 초기화

class MainAdapter(private val mList: ArrayList<String>) : RecyclerView.Adapter<MainAdapter.ViewHolder>() {
	
    // interface 객체 생성
    private var onClickListener: SetOnClickListenerInterface? = null

    // Activity에서 호출 시 객체 초기화
    fun listItemClickFunc(pOnClick: SetOnClickListenerInterface) {
        this.onClickListener = pOnClick
    }

    inner class ViewHolder(private val itemViewBinding: ItemListMainBinding) : RecyclerView.ViewHolder(itemViewBinding.root) {
        fun bind(mItemData: String){
            itemViewBinding.tvName.text = mItemData

            // 클릭하고자 하는 view의 리스너에 데이터 전달
            if(adapterPosition != RecyclerView.NO_POSITION){
                itemViewBinding.ctMain.setOnClickListener {
                    onClickListener?.listItemClickListener(mItemData, itemViewBinding)
                }
            }
        }
    }
    // 생략
}

 

리스트의 아이템을 클릭하면 인터페이스 객체의 메서드를 호출하면서 해당 아이템의 데이터들을 전달하게 된다.


액티비티에서 처리

 mAdapter.listItemClickFunc(object: SetOnClickListenerInterface {
	override fun listItemClickListener(itemData: String, binding: ItemListMainBinding) {
		Toast.makeText(this@MainActivity, itemData, Toast.LENGTH_SHORT).show()
	}
})

어댑터에서 생성한 인터페이스 객체를 초기화 시켜주는 함수를 호출한다.

이때 인터페이스를 상속받는 익명 객체를 넘겨주는데, 인터페이스의 메서드를 오버라이드 하면서 액티비티에서 클릭 처리를 할 수 있다.


아이템을 클릭했을 때 해당 text를 토스트로 띄움

전체 코드

댓글