Search code examples
androidonclicklistenerandroid-recyclerview

RecyclerView Adapter OnClick not Called


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.


Solution

  • 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);
    }