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

Android批发应用开发:如何重置item_quantity等变量至默认值?

解决批发应用中商品属性重置与重复订单问题

我是一名大二IT专业学生,正在开发一款批发应用。应用运行流程如下:

用户首先浏览店铺中的商品,选中商品的数据会被用于创建对象,该对象会被添加至作为用户购物车的ArrayList中。此ArrayList及其实时数据可在Cart页面和Receipt/Checkout页面查看。
点击Receipt页面的OK按钮会复制该ArrayList,将副本存储至订单历史中,最后清空原ArrayList并返回主菜单。

问题现象

  • 修改商品颜色后点击按钮会创建重复订单
  • 二次添加商品时,会出现quantity为0的无效商品,且需多次点击才能更新计数器
  • 点击shirtBTN或shortsBTN后,重置item_quantity、item_color、item_type的操作未生效,新对象会继承旧属性

问题根源

  1. 把商品属性定义为Activity成员变量,生命周期与Activity绑定,一旦控件读取逻辑出错(比如未选中颜色、数量输入异常),就会复用旧值
  2. getQuantity_Sum方法循环条件错误:i < cart.size() && cart.get(i).GETtype_listitem().equals(type)会在遇到非目标类型商品时直接终止循环,无法统计所有同类型商品的数量总和
  3. 不必要的volatile修饰符可能引发内存可见性问题,且这些变量仅在UI线程操作,完全不需要该修饰

解决方案

1. 改用局部变量(最推荐,彻底避免旧值复用)

把item_quantity、item_color、item_type从Activity成员变量改为按钮点击事件内的局部变量,每次点击都会重新初始化变量:

修改shirtBTN点击逻辑:

shirtBTN.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        final Chip tempCHIP;
        final int tempCOLOR;
        final float item_cost;
        // 局部变量,每次点击重新创建
        int item_quantity;
        String item_color;
        String item_type;

        // 校验颜色选择
        tempCOLOR = colorCG.getCheckedChipId();
        if (tempCOLOR == View.NO_ID) {
            Toast.makeText(getApplicationContext(), "请选择颜色", Toast.LENGTH_SHORT).show();
            return;
        }
        tempCHIP = findViewById(tempCOLOR);
        item_color = tempCHIP.getText().toString();

        // 校验数量输入
        try {
            item_quantity = Integer.parseInt(quantityCOUNTER.getText().toString());
            if (item_quantity < 1) {
                Toast.makeText(getApplicationContext(), "数量不能小于1", Toast.LENGTH_SHORT).show();
                quantityCOUNTER.setText("1");
                return;
            }
        } catch (NumberFormatException e) {
            Toast.makeText(getApplicationContext(), "请输入有效数量", Toast.LENGTH_SHORT).show();
            quantityCOUNTER.setText("1");
            return;
        }

        item_type = "SHIRT";
        item_cost = item_quantity * 150;

        checkoutSTRUCT.add(new listitem(item_quantity, item_color, item_type, item_cost));
        Toast.makeText(getApplicationContext(), getCount(checkoutSTRUCT, item_type) + " " + item_type, Toast.LENGTH_SHORT).show();

        shirtCOUNTER.setText(String.valueOf(getQuantity_Sum(checkoutSTRUCT, item_type)));
        // 局部变量无需手动重置,方法结束后自动销毁
    }
});

同理修改shortsBTN的点击逻辑,将相关变量改为局部变量并增加校验。

2. 修复getQuantity_Sum方法

原方法无法统计所有同类型商品,修改为:

private int getQuantity_Sum(ArrayList<listitem> cart, String type){
    int tempSum= 0;
    for (int i = 0; i < cart.size(); i++) {
        // 遍历所有商品,匹配类型后累加数量
        if (cart.get(i).GETtype_listitem().equals(type)) {
            tempSum += cart.get(i).GETqty_listitem();
        }
    }
    return tempSum;
}

3. 优化成员变量重置逻辑(若坚持使用成员变量)

如果一定要保留成员变量,每次点击前先强制重置,并增加输入校验:

shirtBTN.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 先强制重置成员变量
        item_quantity = empty_INT;
        item_color = empty_STR;
        item_type = empty_STR;

        final Chip tempCHIP;
        final int tempCOLOR;
        final float item_cost;

        // 颜色选择校验
        tempCOLOR = colorCG.getCheckedChipId();
        if (tempCOLOR == View.NO_ID) {
            Toast.makeText(getApplicationContext(), "请选择颜色", Toast.LENGTH_SHORT).show();
            return;
        }
        tempCHIP = findViewById(tempCOLOR);
        item_color = tempCHIP.getText().toString();

        // 数量输入校验
        try {
            item_quantity = Integer.parseInt(quantityCOUNTER.getText().toString());
            if (item_quantity < 1) {
                Toast.makeText(getApplicationContext(), "数量不能小于1", Toast.LENGTH_SHORT).show();
                quantityCOUNTER.setText("1");
                return;
            }
        } catch (NumberFormatException e) {
            Toast.makeText(getApplicationContext(), "请输入有效数量", Toast.LENGTH_SHORT).show();
            quantityCOUNTER.setText("1");
            return;
        }

        item_type = "SHIRT";
        item_cost = item_quantity * 150;

        checkoutSTRUCT.add(new listitem(item_quantity, item_color, item_type, item_cost));
        Toast.makeText(getApplicationContext(), getCount(checkoutSTRUCT, item_type) + " " + item_type, Toast.LENGTH_SHORT).show();

        shirtCOUNTER.setText(String.valueOf(getQuantity_Sum(checkoutSTRUCT, item_type)));

        // 再次重置成员变量
        item_quantity = empty_INT;
        item_color = empty_STR;
        item_type = empty_STR;
    }
});

额外优化建议

  • 移除成员变量的volatile修饰符,这些变量仅在UI线程操作,不需要内存可见性保障
  • 对颜色、数量等输入项增加必填校验,避免无效数据进入购物车
  • 考虑将购物车逻辑封装为独立的CartManager类,替代静态ArrayList,提升代码可维护性

内容的提问来源于stack exchange,提问作者disarm9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:20:36