I have list of items coming from server and I am trying to inflate it in RecyclerView
. However, on clicking those items, nothing is happening, even if I have implemented the View.onClickListener
in MyViewHolder
class.
Here's my code for the adapter.
class UserAdapter extends RecyclerView.Adapter<UserAdapter.MyViewHolder> {
ArrayList<User> list;
Context context;
UserAdapter(ArrayList<User>list,Context context) {
Log.e("Listsizeis","" +list.size());
this.list = list;
this.context = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Log.e("InsideOnCreate","Yes");
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.user_list_row, parent, false);
return new MyViewHolder(itemView,context,list,this);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Log.e("InsideOnBind","Yes");
User u = list.get(position);
holder.title.setText(u.getName());
}
@Override
public int getItemCount() {
if(list.size() ==0) return 1;
else return list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView title;
private UserAdapter adapter;
ArrayList<User> userArrayList;
Context context;
public MyViewHolder(View view,Context context,ArrayList<User> userArrayList,UserAdapter adapter) {
super(view);
Log.e("OnMyviewHolder","yes" + userArrayList.size());
this.userArrayList = userArrayList;
this.context = context;
title = view.findViewById(R.id.title);
this.adapter = adapter;
}
@Override
public void onClick(View view) {
Log.e("OnMyviewHolderItem","yes" + userArrayList.size());
Toast.makeText(context, "Item Clicked", Toast.LENGTH_SHORT).show();
}
}
}
onClick
function is not invoking on clicking the item.
I really do not understand what's the point of passing the adapter itself into your ViewHolder
. Anyway, I would like to suggest the following changes in your ViewHolder
which should work.
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title;
ArrayList<User> userArrayList;
Context context;
public MyViewHolder(View itemView, Context context, ArrayList<User> userArrayList) {
super(view);
Log.e("OnMyviewHolder","yes" + userArrayList.size());
this.userArrayList = userArrayList;
this.context = context;
title = view.findViewById(R.id.title);
}
public void bindView(final int pos) {
title.setText(userArrayList.get(pos).getName());
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, userArrayList.get(pos) + "", Toast.LENGTH_SHORT).show();
}
});
}
}
Now in your BindViewHolder
function, you need to call the bindView
function once you have initialized the ViewHolder
.
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ViewHolder vh = (ViewHolder) holder;
vh.bindView(position);
}