user16493824
user16493824

Reputation: 57

How to implement a button onclicklistener inside recycler view kotlin

How to implement a button inside recycler view. The below is my adapter class. In my recycle view layout my button id is. btn_notify. Where do I handle the event. Should I handle the event inside on onBindViewHolder? I am not sure where to implement in on click listener inside the adapater.



import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.bloodbankcompany.R
import com.example.bloodbankcompany.User2

class MyAdapter2(private val userList: ArrayList<User2>): RecyclerView.Adapter<MyAdapter2.MyViewHolder>(){
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyAdapter2.MyViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.list_item2,parent,false)
        return MyViewHolder(itemView)



    }
    

    override fun onBindViewHolder(holder: MyAdapter2.MyViewHolder, position: Int) {
        val user:User2 = userList[position]
        holder.name.text= user.name
        holder.phone.text= user.phone
        holder.address.text =user.address
        holder.bloodGroup.text= user.bloodgroup
        holder.io = user.id

    }

    override fun getItemCount(): Int {
        return userList.size

    }

    public class MyViewHolder(itemView : View): RecyclerView.ViewHolder(itemView){

        val name : TextView = itemView.findViewById(R.id.tvfirstname1)
        val phone :TextView= itemView.findViewById(R.id.tvphone11)
        val address : TextView= itemView.findViewById(R.id.tvaddress1)
        val bloodGroup: TextView =itemView.findViewById(R.id.tvbloodg1)
        val id: TextView = itemView.findViewById(R.id.tvid)
        var io: String? = ""
        var button: Button = itemView.findViewById(R.id.btn_notify)
 }
} ``` 



Upvotes: 0

Views: 2891

Answers (1)

akhilsreekar
akhilsreekar

Reputation: 326

I would prefer ViewBinding or DataBinding rather than passing the views or using findViewById.

To answer your question, I think there are two ways to go.

  1. You can implement the set on click listener inside the onBindViewHolder itself
  2. You can create a function called bind() inside the RecyclerView.ViewHolder and call it.(Preferable as you might have multiple viewholders and this looks cleaner when using multiple viewholders)
1 .

 override fun onBindViewHolder(holder: MyAdapter2.MyViewHolder, position: Int) {
        val user:User2 = userList[position]
        holder.name.text= user.name
        holder.phone.text= user.phone
        holder.address.text =user.address
        holder.bloodGroup.text= user.bloodgroup
        holder.io = user.id
        holder.button.setOnClickListener{
    //todo: enter code here
        }
    }



2.
 override fun onBindViewHolder(holder: MyAdapter2.MyViewHolder, position: Int) {
      holder.bind(holder.itemView)
}
 
public class MyViewHolder(itemView : View):RecyclerView.ViewHolder(itemView){
fun bind(){
     var button: Button = itemView.findViewById(R.id.btn_notify)
     button.setOnClickListener{
        //todo: do something
     }
     view.setOnClickListener{
        if(){
             //todo: do something
        }else{
             //todo: do something
        }
     }
    }
}

Upvotes: 2

Related Questions