Android开发:点击RecyclerView条目时如何从数据库获取商品及对应数量?
解决方案
方法1:详情页直接根据订单编号查询商品数据(改代码量最少)
你已经在点击条目时把订单编号reference传到了Order_detail,直接用这个编号拉取对应produit节点下的所有商品键值对即可:
- 修改
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对象中,直接传递整个序列化对象到详情页:
- 修改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; } }
- 在列表页查询订单列表的逻辑中,把每个订单的
produit节点数据解析到produitMap字段里。 - 修改适配器点击事件,直接传递整个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); } });
- 详情页直接读取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
相关产品推荐
相关产品推荐

