Reputation: 49
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
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
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