You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:15:03