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()
}
})
어댑터에서 생성한 인터페이스 객체를 초기화 시켜주는 함수를 호출한다.
이때 인터페이스를 상속받는 익명 객체를 넘겨주는데, 인터페이스의 메서드를 오버라이드 하면서 액티비티에서 클릭 처리를 할 수 있다.
![[Android] RecyclerView 클릭 이벤트 처리하기 - undefined - 액티비티에서 처리 [Android] RecyclerView 클릭 이벤트 처리하기 - undefined - 액티비티에서 처리](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
'Android > RecyclerView' 카테고리의 다른 글
[Android] RecyclerView에서 페이징+삭제 처리하기 (with Room) #2 (0) | 2023.01.09 |
---|---|
[Android] RecyclerView에서 페이징 처리하기 #1 (0) | 2022.12.16 |
[Android] Expandable RecyclerView 구현하기 (0) | 2022.11.22 |
[Android] RecyclerView Drag and Drop 구현하기 (0) | 2022.11.18 |
댓글