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

从Activity获取Adapter中ArrayList返回值不符预期的问题求助

问题根源

你当前的问题出在每次点击按钮时都新建了一个OrderAdapter实例,这个新实例和RecyclerView正在使用的Adapter完全是两个不同的对象。你在Adapter里操作的是RecyclerView绑定的那个实例的list_cart,但你在Activity中获取的是新实例的空列表,所以size始终是0。


直接修复方案(快速解决)

  1. 在你的Activity中,保留RecyclerView绑定的OrderAdapter实例的全局引用,不要每次点击都new新的:

    // 在Activity的成员变量里声明Adapter
    private OrderAdapter orderAdapter;
    
    // 初始化RecyclerView的时候创建Adapter并保存引用
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_activity_layout);
        
        // ... 其他初始化代码
        ArrayList<Barang> barangList = ...; // 你的商品数据列表
        orderAdapter = new OrderAdapter(barangList, this);
        recyclerView.setAdapter(orderAdapter);
    }
    
  2. 修改按钮点击事件,使用这个全局的Adapter实例:

    btnUpdateTotal.setOnClickListener(view -> {
        ArrayList<Cart> myCart = orderAdapter.getArrayList();
        int total = myCart.size();
        tvTotalCart.setText("Total in cart : " + String.valueOf(total));
    });
    

更规范的通信方式(推荐)

直接从Activity获取Adapter的列表不符合面向对象的封装原则,而且容易引发后续问题。更好的做法是给Adapter添加回调接口,当list_cart发生变化时主动通知Activity:

  1. 在OrderAdapter中定义回调接口:

    @RequiresApi(api = Build.VERSION_CODES.N)
    public class OrderAdapter extends RecyclerView.Adapter<OrderAdapter.ViewHolder> {
        private ArrayList<Barang> list_barang;
        private ArrayList<Cart> list_cart = new ArrayList<Cart>();
        private Context context;
        private OnCartChangeListener cartChangeListener;
    
        // 新增回调接口
        public interface OnCartChangeListener {
            void onCartChanged(ArrayList<Cart> cartList);
        }
    
        // 给Adapter添加设置回调的方法
        public void setOnCartChangeListener(OnCartChangeListener listener) {
            this.cartChangeListener = listener;
        }
    
        // 原构造函数不变
        public OrderAdapter(ArrayList<Barang> list_barang, Context context){
            this.list_barang = list_barang;
            this.context = context;
        }
    
        // ... 其他原有代码
    
        // 修改ViewHolder中的btnTambah点击事件,添加回调通知
        public void actionItem(int position){
            btnTambah.setOnClickListener(view -> {
                Cart cart = new Cart();
                Barang myBarang = list_barang.get(position);
    
                String productId = myBarang.getID();
                String productName = myBarang.getTitle();
                double productHarga = myBarang.getHarga();
                int qty = Integer.parseInt(etQtyBarang.getText().toString());
    
                cart.setProductID(productId);
                cart.setProductName(productName);
                cart.setHarga(productHarga);
                cart.setQty(qty);
                list_cart.add(cart);
                
                // 通知Activity购物车变化
                if (cartChangeListener != null) {
                    cartChangeListener.onCartChanged(list_cart);
                }
            });
        }
    }
    
  2. 在Activity中实现这个回调,实时更新总数:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_activity_layout);
        
        // ... 其他初始化代码
        ArrayList<Barang> barangList = ...;
        orderAdapter = new OrderAdapter(barangList, this);
        // 设置回调
        orderAdapter.setOnCartChangeListener(new OrderAdapter.OnCartChangeListener() {
            @Override
            public void onCartChanged(ArrayList<Cart> cartList) {
                int total = cartList.size();
                tvTotalCart.setText("Total in cart : " + String.valueOf(total));
            }
        });
        recyclerView.setAdapter(orderAdapter);
    }
    

这样一来,每次购物车添加商品时,Activity都会自动收到通知并更新总数,不需要手动点击按钮,体验更好,也更符合Android组件通信的规范。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:11:16