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

Android开发:点击RecyclerView条目时如何从数据库获取商品及对应数量?

解决方案

方法1:详情页直接根据订单编号查询商品数据(改代码量最少)

你已经在点击条目时把订单编号reference传到了Order_detail,直接用这个编号拉取对应produit节点下的所有商品键值对即可:

  1. 修改Order_detail的onCreate方法,新增拉取商品数据的逻辑:
// 先声明Firebase数据库引用
private DatabaseReference orderRef;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_commande_detail2);

    namepdv = findViewById(R.id.nompdv);
    refcommande = findViewById(R.id.refcommande);
    datecommande = findViewById(R.id.datecommande);
    etat = findViewById(R.id.etatcommande);
    produitcmnd = findViewById(R.id.produitcmnd);
    qnt = findViewById(R.id.qnt);
    //  ---------------原有赋值逻辑保留--------------- //
    namepdv.setText(getIntent().getStringExtra("nompdv"));
    String orderReference = getIntent().getStringExtra("reference");
    refcommande.setText(orderReference);
    datecommande.setText(getIntent().getStringExtra("datecommande"));
    etat.setText(getIntent().getStringExtra("etat"));

    //  ---------------新增拉取商品数据逻辑--------------- //
    // 把下方的「你的订单根节点路径」替换为你自己存订单的父节点路径,就是保存数据时用的reference变量对应的路径
    orderRef = FirebaseDatabase.getInstance().getReference().child("你的订单根节点路径").child(orderReference).child("produit");
    orderRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            StringBuilder produitSb = new StringBuilder();
            StringBuilder qntSb = new StringBuilder();
            // 遍历当前订单下的所有商品
            for (DataSnapshot prodSnapshot : snapshot.getChildren()) {
                String produitName = prodSnapshot.getKey();
                String count = prodSnapshot.getValue(String.class);
                produitSb.append(produitName).append("\n");
                qntSb.append(count).append("\n");
            }
            // 赋值到对应展示控件
            produitcmnd.setText(produitSb.toString().trim());
            qnt.setText(qntSb.toString().trim());
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            // 按需添加异常处理逻辑
        }
    });
}

方法2:改造Order类支持多商品,列表页预加载后直接传递

如果不想在详情页额外发起数据库请求,可以提前把商品数据加载到Order对象中,直接传递整个序列化对象到详情页:

  1. 修改Order类,新增多商品存储字段:
public class Order implements Serializable {
    public  String refernce, nompdv, etat, datecommande, produitcommande, qntcommande;
    String user_id;
    // 新增字段存储当前订单所有商品和对应数量
    private Map<String, String> produitMap;

    // 原有构造方法、原有getter/setter保留,新增下面两个方法
    public Map<String, String> getProduitMap() {
        return produitMap;
    }

    public void setProduitMap(Map<String, String> produitMap) {
        this.produitMap = produitMap;
    }
}
  1. 在列表页查询订单列表的逻辑中,把每个订单的produit节点数据解析到produitMap字段里。
  2. 修改适配器点击事件,直接传递整个Order对象:
v.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(view.getContext(), Order_detail.class);
        int pos = v.getAdapterPosition();
        if (pos != RecyclerView.NO_POSITION) {
            Order clickedDataItem = listArray.get(pos);
            // 直接传递整个序列化后的Order对象
            intent.putExtra("order", clickedDataItem);
        }
        view.getContext().startActivity(intent);
    }
});
  1. 详情页直接读取Order对象里的商品数据即可:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_commande_detail2);
    // 原有控件初始化逻辑保留
    Order order = (Order) getIntent().getSerializableExtra("order");
    if (order != null) {
        namepdv.setText(order.getNompdv());
        refcommande.setText(order.getRefernce());
        datecommande.setText(order.getDatecommande());
        etat.setText(order.getEtat());
        // 遍历商品Map赋值到控件
        Map<String, String> produitMap = order.getProduitMap();
        StringBuilder produitSb = new StringBuilder();
        StringBuilder qntSb = new StringBuilder();
        for (Map.Entry<String, String> entry : produitMap.entrySet()) {
            produitSb.append(entry.getKey()).append("\n");
            qntSb.append(entry.getValue()).append("\n");
        }
        produitcmnd.setText(produitSb.toString().trim());
        qnt.setText(qntSb.toString().trim());
    }
}

内容的提问来源于stack exchange,提问作者Mohamed Yacine Zouaoui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:15:01