RecylerView只能烘烤第一项,无论单击的项如何

时间:2018-07-17 12:57:40

标签: android android-recyclerview android-cardview toast

我有一个回收站视图,我想吐司单击的项目的ID。取而代之的是,每次我敬酒时,我都会得到第一件东西,而无论我敬酒的是什么。

查看此图片 enter image description here

无论我是烘烤奎宁,布芬还是其他任何食物,它都可以扑热息痛。

这是我的代码:

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


}

我打算将烘烤的参数项作为意图传递给下一个活动,但这现在是一个问题。

6 个答案:

答案 0 :(得分:1)

替换您的OnClick侦听器,以便它通过使用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();

            }
        });

答案 1 :(得分:1)

将此代码放入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();

        }
    });

然后在ViewHolder类中声明该项目的父视图,并在父视图上实现onClickListener。

希望这会有所帮助。

答案 2 :(得分:1)

  v.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
      Toast.makeText(context, ""+drugList.get(getAdapterPosition()).getId(), 
                     Toast.LENGTH_SHORT).show();
       }
    });  

答案 3 :(得分:1)

从此onCreateViewHolder方法中删除以下代码:

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

            }
        });

并在onBindViewHolder方法中添加以下代码:

 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();

                }
            });

答案 4 :(得分:1)

使用以下代码,它将与您的代码配合使用。

  @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();

                }
            });

        }

答案 5 :(得分:1)

要提供实现onClickListener的正确方法,可以看一下: @nahaarman回复或this其他方法。

从这些链接中,您可以看到通过了position以提供来自recyclerview的正确元素。

我从您的代码中看到的是,您只设置了第一个DrugId drugModel.getDrugId(),就像其他人所说的那样,您需要将代码从onCreateViewHolder移到onBindViewHolder。