andr111
andr111

Reputation: 49

Recyclerview click events handling best practice?

There are many methods to handle click events in Recyclerview, but I do not know the best method in terms of performance and minimizing errors.

First method I saw is to handle click event in onBindViewHolder Method

   @Override
         public void onBindViewHolder(@NonNull MyViewHolder holder, int postion) {

             holder.button.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
                   //Add action 
                 }
             });
         }

Second method is to handle click event in onCreateViewHolder Method

@Override
public Viewholder onCreateViewHolder(ViewGroup parent, int viewType) {
 View v = LayoutInflater.from(parent.getContext()).inflate(item_adapter,    parent, false);
 final ViewHolder holder = new ViewHolder(v);

 holder.itemView.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
        // Add action
     }
 });
 return holder;
}

Third method is using interface and send info to MainActivity or fragment and handle the click event in MainActivity or fragment.

Which way is better?

Upvotes: 0

Views: 204

Answers (2)

Anirudh Goud
Anirudh Goud

Reputation: 346

The clean way i prefer is setting a tag to an item in onBindViewHolder and recieve the same tag data in View class.

 @Override
    public void onBindViewHolder(myViewHolder viewHolder, int position) {
        viewHolder.button.setTag(position); //Here we are setting a position integer
        viewHolder.button.setTag(object); //set any custom object this way
    }

In your View/Activity/Fragment class recieve the tag and get the data

     @Override
public void onClick(View view) {
    int position = (int) view.getTag();  
    Log.e("DEMO","Position"+position)

    if(view.getTag() instanceOf Object) {

    Object object = (Object) view.getTag();   
    Log.e("DEMO","Position"+obect.getName())     

    }

Upvotes: 0

Kirtan
Kirtan

Reputation: 1812

Handling click event in ViewHolder class + Interface is the best practice to follow.

Here is an example

interface ClickListener{
    fun onItemClick(position:Int,item:Forecast)
}

var clickListener:ClickListener?= null
inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
{
    init {
        itemView.r_forecast_tv_forecast.setOnClickListener {
            val position = adapterPosition
            val model = data[position]
            clickListener?.onItemClick(position,model)
        }
    }
}

Upvotes: 1

Related Questions