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

如何实现点击另一Activity按钮时持续向ArrayList添加元素

问题根因

你当前的代码每次触发添加逻辑时都会重新执行new ArrayList<>()创建全新的列表实例,之前存入的所有元素会随着旧实例被回收而全部丢失,自然无法实现持续累加添加元素的效果,同时跨Activity场景下也没有正确处理列表的持有逻辑,导致数据无法持续留存。

修复方案

核心原则:列表的初始化操作只能执行一次,绝对不能放到按钮点击的回调逻辑里,根据你的业务场景选对应实现即可:

  • 方案1:使用共享ViewModel持有列表(官方推荐,适配配置变更、页面切换场景)
    先定义共享的ViewModel类,把列表初始化放在ViewModel内部,保证全局唯一:

    public class GoodsViewModel extends ViewModel {
        // 列表仅在ViewModel首次创建时初始化一次
        private final ArrayList<String> goodsList = new ArrayList<>();
    
        public ArrayList<String> getGoodsList() {
            return goodsList;
        }
    
        public void addGoodsInfo(String name, String price, String quantity) {
            goodsList.add(name);
            goodsList.add(price);
            goodsList.add(quantity);
        }
    }
    

    在两个关联Activity中获取同一个ViewModel实例,点击按钮时直接调用添加方法即可,不需要重复创建列表:

    // 按钮点击回调中仅执行添加逻辑
    GoodsViewModel viewModel = new ViewModelProvider(this).get(GoodsViewModel.class);
    viewModel.addGoodsInfo(name, price, quantity);
    
  • 方案2:通过ActivityResult回传数据(适配点击第二个Activity按钮后返回上一页的场景)
    在第一个页面的初始化时机(如onCreate)只执行一次列表初始化,后续仅做追加操作:

    // 仅在页面初始化时new一次列表,不要放到点击事件里
    ArrayList<String> arrayList = new ArrayList<>();
    
    // 注册页面跳转回调,接收第二个页面回传的元素
    ActivityResultLauncher<Intent> goodsLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                    Intent resData = result.getData();
                    // 把回传的元素追加到已有列表
                    arrayList.add(resData.getStringExtra("name"));
                    arrayList.add(resData.getStringExtra("price"));
                    arrayList.add(resData.getStringExtra("quantity"));
                }
            }
    );
    

    在第二个Activity的按钮点击逻辑中,把当前要添加的元素通过Intent回传即可,不需要单独维护列表实例:

    // 按钮点击逻辑
    Intent backIntent = new Intent();
    backIntent.putExtra("name", name);
    backIntent.putExtra("price", price);
    backIntent.putExtra("quantity", quantity);
    setResult(RESULT_OK, backIntent);
    finish();
    

踩坑提醒:只要你把arrayList = new ArrayList<>()写在每次点击都会执行的代码块里,列表就永远只能保存最后一次添加的3个元素,之前的数据都会被清空。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:54:32