Search code examples
androidkotlinandroid-recyclerviewonclicklistener

Set listener for a child of a child of recyclerView in Kotlin


I have a RecyclerView which there are three buttons in its model, how can I set a listener for each button? I can access RecyclerView's child and set a listener for it but I want to set a listener for a child of a child of RecyclerView. Consider that I'm using Kotlin.

I used this code which let you access the child of recyclerView, but not the child of the child of RecyclerView:

fun RecyclerView.addOnItemClickListener(onClickListener: OnItemClickListener) {
    this.addOnChildAttachStateChangeListener(object: RecyclerView.OnChildAttachStateChangeListener {
        override fun onChildViewDetachedFromWindow(view: View) {
            view.setOnClickListener(null)
        }
        override fun onChildViewAttachedToWindow(view: View) {
            view.setOnClickListener {
                val holder = getChildViewHolder(view)
                onClickListener.onItemClicked(holder.adapterPosition, view)
            }
        }
    })
}

Solution

  • To achieve this you have to set OnClickListener on each Button of RecyclerView item. Check below as an example

    class YourAdapter: RecyclerView.Adapter<YourAdapter.YourViewHolder>(), View.OnClickListener {
    
        //Other code
        ....
    
        override fun onBindViewHolder(holder: YourAdapter.YourViewHolder, position: Int) {
    
            holder.button1.setOnClickListener(this)
            holder.button2.setOnClickListener(this)
            holder.button3.setOnClickListener(this)
        }
    
        override fun onClick(v: View?) {
            when(v?.id) {
                R.id.button1 -> {
                    //Do your operation
                }
    
                R.id.button2 -> {
                    //Do your operation
                }
    
                R.id.button3 -> {
                    //Do your operation
                }
            }
        }
    
        class YourViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
            lateinit var button1: Button
            lateinit var button2: Button
            lateinit var button3: Button
        }
    }