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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:36:05