Dico

[Kotlin] RecyclerView - Item View onClick

  • 민갤

목적

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