如何在RecyclerView中展示Firebase Realtime Database订单下的子级商品数据
订单商品列表加载问题解决方案
你的代码核心存在两处逻辑错误:
- 已经定位到了具体订单节点
/Orders/${shopId}/${orderId},额外增加的orderByChild(orderId).equalTo(orderId)查询条件完全多余,反而会过滤掉你需要的商品子节点 - 遍历逻辑不符合数据结构,你当前遍历的是条件查询返回的空结果列表,实际应该直接遍历订单节点下存储商品的子节点集合
修正后代码
// 直接定位到对应订单节点即可,不需要额外的查询过滤条件 databaseReference.child("Orders").child(shopId).child(orderId) .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { ArrayList<PlaceOrder> placeOrderArrayList = new ArrayList<>(); // 直接遍历订单节点下的所有商品子节点 for (DataSnapshot productSnapshot : dataSnapshot.getChildren()){ PlaceOrder product = productSnapshot.getValue(PlaceOrder.class); if (product != null) { placeOrderArrayList.add(product); } } // 如果之前未给RecyclerView设置LayoutManager,需要先添加下方代码 // productsRv.setLayoutManager(new LinearLayoutManager(UserOrderDetailsActivity.this)); UserOrderDetailsAdapter userOrderDetailsAdapter = new UserOrderDetailsAdapter(UserOrderDetailsActivity.this,placeOrderArrayList); productsRv.setAdapter(userOrderDetailsAdapter); } @Override public void onCancelled(@NonNull DatabaseError error) { // 建议增加错误日志打印,方便排查问题 Log.e("OrderDetailLoad", "加载订单商品失败", error.toException()); } });
额外注意事项
- 请确认
PlaceOrder实体类包含无参构造方法,且字段名和Firebase中存储的商品字段名完全对应,没有拼写错误,否则会出现序列化失败返回null的问题 - 如果你的订单节点下除了商品列表还有其他基础字段(比如订单号、收货地址等),需要先定位到商品列表所在的子节点再遍历,比如如果商品存储在orderId节点下的products子节点中,就把查询路径改成
child("Orders").child(shopId).child(orderId).child("products")
内容的提问来源于stack exchange,提问作者Parwez Akhter
相关产品推荐
相关产品推荐

