从Activity获取Adapter中ArrayList返回值不符预期的问题求助
问题根源
你当前的问题出在每次点击按钮时都新建了一个OrderAdapter实例,这个新实例和RecyclerView正在使用的Adapter完全是两个不同的对象。你在Adapter里操作的是RecyclerView绑定的那个实例的list_cart,但你在Activity中获取的是新实例的空列表,所以size始终是0。
直接修复方案(快速解决)
在你的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); }修改按钮点击事件,使用这个全局的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:
在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); } }); } }在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
相关产品推荐
相关产品推荐

