-2

I have a recycler view that I want to toast the id of the clicked item. Instead every time I toast I get the first item regardless of the item that I toast.

See this image enter image description here

It toasts paracetamol regardless of whether i toast quinine or brufen or whichever.

Here is my code:

public class DrugsAdapter extends RecyclerView.Adapter<DrugsAdapter.ViewHolder> {
    private List<DrugModel> drugList;
    private Context mContext;
    private RecyclerView mRecyclerV;
    DrugModel drugModel;

    public class ViewHolder extends RecyclerView.ViewHolder {
        // each data item is just a string in this case
        public TextView drugName,drugMode;
        public View layout;

        public ViewHolder(View v) {
            super(v);
            layout = v;
            drugName = (TextView) v.findViewById(R.id.drugName);
            drugMode = v.findViewById(R.id.drugModeOfAction);
            drugName.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            });
        }
    }

    public void add(int position, DrugModel drug) {
        drugList.add(position, drug);
        notifyItemInserted(position);
    }

    public void remove(int position) {
        drugList.remove(position);
        notifyItemRemoved(position);
    }


    // Provide a suitable constructor (depends on the kind of dataset)
    public DrugsAdapter(List<DrugModel> myDataset, Context context, RecyclerView recyclerView) {
        drugList = myDataset;
        mContext = context;
        mRecyclerV = recyclerView;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public DrugsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
//        drugModel = new DrugModel();
//        drugModel = drugList.get(viewType);
        // create a new view
        LayoutInflater inflater = LayoutInflater.from(
                parent.getContext());
        View v =
                inflater.inflate(R.layout.drug_item, parent, false);
        // set the view's size, margins, paddings and layout parameters
        ViewHolder vh = new ViewHolder(v);

        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String a = drugModel.getDrugId();
                Toast.makeText(mContext,"id "+a,Toast.LENGTH_LONG).show();

            }
        });
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {

        final DrugModel drug = drugList.get(position);
        holder.drugName.setText(drug.getdrugName());
        holder.drugMode.setText(drug.getMode());



    }

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


}

I intend to pass the toasted parameter item to the next activity as an intent but that now is a problem.

Francis Ting
  • 671
  • 6
  • 15

6 Answers6

1

Replace your OnClick listener so it properly uses item it's currently bound to by using getAdapterPosition():

final ViewHolder vh = new ViewHolder(v);
v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String a = drugList.get(vh.getAdapterPosition()).getDrugId();
                Toast.makeText(mContext,"id "+a,Toast.LENGTH_LONG).show();

            }
        });
Pawel
  • 15,548
  • 3
  • 36
  • 36
1

Put this code in onBindViewHolder()

   holder.parentView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String a = drug.getDrugId();
            Toast.makeText(mContext,"id "+a,Toast.LENGTH_LONG).show();

        }
    });

And declare your parent view of the item in ViewHolder class and implement onClickListener on the parent view.

Hope this helps.

Sarthak Gandhi
  • 2,130
  • 1
  • 16
  • 23
1
  v.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
      Toast.makeText(context, ""+drugList.get(getAdapterPosition()).getId(), 
                     Toast.LENGTH_SHORT).show();
       }
    });  
faran.javed
  • 418
  • 2
  • 15
1

Remove below code from this onCreateViewHolder method:

v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String a = drugModel.getDrugId();
                Toast.makeText(mContext,"id "+a,Toast.LENGTH_LONG).show();

            }
        });

and Add below code in onBindViewHolder method:

 holder.layout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String a = drug.getDrugId();
                    Toast.makeText(mContext,"id "+a,Toast.LENGTH_LONG).show();

                }
            });
kishna.147
  • 167
  • 8
1

Use the below code it will work fine with your code.

  @Override
        public void onBindViewHolder(ViewHolder holder, final int position) {

            final DrugModel drug = drugList.get(position);
            holder.drugName.setText(drug.getdrugName());
            holder.drugMode.setText(drug.getMode());
    holder.layout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Toast.makeText(mContext,"id "+drug.getId(),Toast.LENGTH_LONG).show();

                }
            });

        }
Ejaz Ahmad
  • 614
  • 5
  • 12
1

To provide the right way to implement the onClickListener you can take a look at: @nahaarman reply or this other method.

From these links you can see that a position it's passed to provide the right element from the recyclerview.

What i see from your code, you are setting just the first drugId drugModel.getDrugId() and like other people saying you need to move your code from onCreateViewHolder to onBindViewHolder.

justo
  • 153
  • 1
  • 4
  • 16