[Kotlin] RecyclerView - Item View onClick
Android목적
RecyclerView의 Item을 선택했을 때, 동작할 onClick 함수를 Adapter Class 외부에서 작성할 수 있게 한다.
이유
필자는 한 화면에서 하나의 RecyclerView를,
세 개의 버튼에 따라 각기 다른 내용으로 나오도록 재사용하는 데서 생긴 문제를 해결하고자 이 방법을 사용했다.
- OnItemTouchListener Class를 정의하여 버튼마다 다른 인자를 넘기도록 했는 데 Listener가 호출되는 만큼 누적되서 호출되었다.
교훈
addOnItemTouchListener의 'add'는 그냥 붙어 있는 게 아니다.
Adapter Class 내부에 Interface를 생성하여 Item 클릭 시 실행될 함수를 추상적으로 정의하고
onBindViewHolder에서 item View에 setOnClickListener를 걸어 그 실행 함수를 호출한다.
class RvAdapter(val context: Context, val list: ArrayList): RecyclerView.Adapter()
{
interface ItemClick
{
fun onClick(view: View, position: Int)
}
var itemClick: ItemClick? = null
override fun onBindViewHolder(holder: RvAdapter.InputHolder?, position: Int) {
if(itemClick != null)
{
holder?.itemView?.setOnClickListener { v ->
itemClick?.onClick(v, position)
}
}
}
(...)
}
Adapter를 호출하는 곳에서 추상 함수를 정의한다.
val adapter = RvAdapter(context, list)
adapter.itemClick = object: RvAdapter.ItemClick {
override fun onClick(view: View, position: Int) {
Toast.makeText(context, position.toString(), Toast.LENGTH_SHORT).show()
}
}
re.adapter = adapter