如何实现点击另一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
相关产品推荐
相关产品推荐

