点击Recyclerview条目弹出Dialog获取输入后仅更新对应条目问题求助
问题原因
你遇到的多条目更新问题是RecyclerView的ViewHolder复用机制导致的:
- 你直接修改了holder中的
txtQty控件文本,没有同步更新对应数据源DrugData里的数值 - 当RecyclerView滚动,该ViewHolder被复用到其他位置的条目时,之前设置的文本会被带到新条目,就会出现多个条目显示相同数量的异常
修复步骤
步骤1:给DrugData实体类新增数量存储字段
先在DrugData类中添加存储采购数量的字段,配套get/set方法:
public class DrugData { // 原有字段保留 private int poQty; // 新增字段存储当前药品的采购数量 public int getPoQty() { return poQty; } public void setPoQty(int poQty) { this.poQty = poQty; } }
步骤2:修改onBindViewHolder逻辑
每次绑定条目时从数据源取最新的数量赋值给控件,同时点击事件传入当前条目的position和对应的DrugData对象:
public void onBindViewHolder(Adapter_PO_Brands.BrandViewHolder holder, int position) { DrugData DD = mDrugData.get(position); holder.txtBrand.setText(DD.getBrand()); holder.txtGeneric.setText(DD.getGeneric()); // 新增:绑定数量,每次刷新都从数据源取最新值 holder.txtQty.setText("Qty : " + DD.getPoQty()); holder.btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 不再传入TextView,改为传入数据源对象和当前位置 ShowAddPOQty(DD, position); } }); }
步骤3:修改ShowAddPOQty逻辑
不再直接修改控件,先更新数据源,再调用notifyItemChanged只刷新指定位置的条目:
public void ShowAddPOQty (DrugData dd, int position) { // 建议Dialog改为局部变量,不要用全局变量避免多个弹窗冲突 Dialog dialog = new Dialog(mContext); dialog.setContentView(R.layout.dialog_po_qty); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); TextView txtQty=dialog.findViewById(R.id.txtQty); TextView Increase=dialog.findViewById(R.id.increase); TextView Decrease=dialog.findViewById(R.id.decrease); MaterialButton btAdd=dialog.findViewById(R.id.btn_Add); MaterialButton btCancel=dialog.findViewById(R.id.btn_Cancel); // 可选:回显当前已设置的数量到Dialog输入框 txtQty.setText(String.valueOf(dd.getPoQty())); btAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 新增输入校验,避免非数字输入崩溃 String qtyStr = txtQty.getText().toString().trim(); if (qtyStr.isEmpty()) { // 可自行添加Toast提示用户输入合法数量 return; } int inputQty = Integer.parseInt(qtyStr); // 先更新数据源 dd.setPoQty(inputQty); // 仅刷新当前点击的条目,不会影响其他条目 notifyItemChanged(position); dialog.cancel(); } }); dialog.show(); }
额外说明
你原有逻辑中的加减按钮(Increase/Decrease)还没有写点击事件,自行补充修改Dialog中txtQty的数值逻辑即可,不影响整体更新逻辑。
内容的提问来源于stack exchange,提问作者Supun Ayeshmantha
相关产品推荐
相关产品推荐

