【问题标题】:RecylerView Toasts only first item regardless of clicked itemRecyclerView Toasts only first item 无论点击的项目
【发布时间】:2018-07-17 12:57:40
【问题描述】:

我有一个回收者视图,我想为所点击项目的 id 敬酒。相反,每次我敬酒时,我都会得到第一个项目,而不管我敬酒的项目是什么。

查看此图片

不管我烤奎宁还是布洛芬,它都会烤扑热息痛。

这是我的代码:

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


}

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

【问题讨论】:

    标签: android android-recyclerview android-cardview toast


    【解决方案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();
    
                }
            });
    

    【讨论】:

      【解决方案2】:

      把这段代码放在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。

      希望这会有所帮助。

      【讨论】:

      • 谢谢萨塔克。但是我应该用什么代替 parentView ,因为它给出了错误。
      • 父视图是最外层的ViewGroup,如linearLayout或RelativeLayout。只需给它一个 id 并在 viewHolder 中实现它,就像任何视图一样。
      【解决方案3】:
        v.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
            Toast.makeText(context, ""+drugList.get(getAdapterPosition()).getId(), 
                           Toast.LENGTH_SHORT).show();
             }
          });  
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          使用下面的代码,它将与您的代码一起正常工作。

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

          【讨论】:

            【解决方案6】:

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

            从这些链接中,您可以看到 position 它被传递以提供来自 recyclerview 的正确元素。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多