itemView.getTag() returns -1

Viewed 106

I am using RecyclerView and I want to view the the data of list item that I click on. I'm using itemView.getTag() to get the value of index and typecasting it to my CustomAdapter.

I tried various ways but not to help. please help me.

Here's my code:

public class DonorAdapter extends RecyclerView.Adapter<DonorAdapter.ViewHolder> {

    ArrayList<Donor> donorsList;

    ItemSelected activity;
    public interface ItemSelected{
        void onItemClicked(int index);
    }
    public DonorAdapter(Context context, ArrayList<Donor> list){


        activity = (ItemSelected) context;
        donorsList = list;
    }

    public class ViewHolder extends RecyclerView.ViewHolder
    {
        ImageView ivDonorGender;
        TextView tvListName;
        TextView tvBloodGroup;
        public ViewHolder(@NonNull final View itemView) {
            super(itemView);
            ivDonorGender = itemView.findViewById(R.id.ivDonorGender);
            tvListName = itemView.findViewById(R.id.tvListName);
            tvBloodGroup = itemView.findViewById(R.id.tvListBloodGroup);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    activity.onItemClicked(donorsList.indexOf((Donor) itemView.getTag()));
                }
            });
        }
    }
@NonNull
    @Override
    public DonorAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.donors_list, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull DonorAdapter.ViewHolder holder, int position) {
        holder.tvListName.setText(donorsList.get(position).getName());
        holder.tvBloodGroup.setText(donorsList.get(position).getSurname());

      }
    }

    @Override
    public int getItemCount() {
        return donorsList.size();
    }
}

I am new to android so pardon me if I can't explain properly

Here's the problematic part

itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
    activity.onItemClicked(donorsList.indexOf((Donor)                
    itemView.getTag()));
}
1 Answers

I think you need to set the tag for each recycled item in onBindViewHolder

@Override
public void onBindViewHolder(@NonNull DonorAdapter.ViewHolder holder, int position) {
    holder.tvListName.setText(donorsList.get(position).getName());
    holder.tvBloodGroup.setText(donorsList.get(position).getSurname());
    holder.itemView.setTag(donorsList.get(position)); // change here
  }
}
Related