首页 > 解决方案 > 如何在 Firestore android 中添加多个回调?

问题描述

我正在尝试将模型插入到另一个模型中,该模型的数据来自 firestore。我尝试了回调方法,但找不到数据不会循环的方法。

这是我的数据库的结构

第1部分 第1部分

第2部分 在此处输入图像描述

Part3 在此处输入图像描述 下面是我必须遵循的 java 模型的结构。

basketProductsModelList.add(new BasketProductsModel( "image", "prodtitle", 25, 19.00, 25.00, "prodID"));
        List<CartItemModel> cartItemModelsList = new ArrayList<>();
        cartItemModelsList.add(new CartItemModel(basketProductsModelList, R.drawable.yumin, 2, "Yumin","12345", "percent", 5));
        cartItemModelsList.add(new CartItemModel(basketProductsModelList, R.drawable.puregold, 0, "Puregold", "", "", 0));
        CartAdapter cartAdapter = new CartAdapter(cartItemModelsList);
        cartItemRecyclerView.setAdapter(cartAdapter);
        cartAdapter.notifyDataSetChanged();

这是我尝试过的回调。我的问题是当我得到prodID使用的数据时,for loop我不知道我可以在哪里放置

CartAdapter cartAdapter = new CartAdapter(cartItemModelsList); cartItemRecyclerView.setAdapter(cartAdapter); cartAdapter.notifyDataSetChanged();

编辑:

我将适配器包含在其中finalData,但没有出现错误,但输出重复。

如果我把它放在外面,我不会得到模型的数据,因为 firestore 是异步的。

finalData(new finalCallback() {
            @Override
            public void onCallback(final List<String> prodID, List<Integer> prodQuantity) {

                for (int n = 0; n < prodID.size(); n++){
                    final int quantity = prodQuantity.get(n);
                    final String prodIDs = prodID.get(n);
                    db.collection("Products").document(prodIDs).get()
                    .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                            if (task.isSuccessful()) {
                                DocumentSnapshot snapshot2 = task.getResult();
                                String prodName = snapshot2.get("productName").toString();
                                String prodImage = snapshot2.get("productImage.image_1").toString();
                                boolean bargainSale = (boolean) snapshot2.get("Bargain.bargainStatus");
                                long prodPrice = (long) snapshot2.get("productPrice");
                                double oldPrice = (double) prodPrice;


                                if (bargainSale) {
                                    long discountValue = (long) snapshot2.get("Bargain.discountValue");
                                    double newDsct = (int) discountValue;
                                    double discountPoint = newDsct / 100;
                                    double dp = prodPrice * discountPoint;
                                    double newPrice = prodPrice - dp;

                                    basketProductsModelList.add(new BasketProductsModel(prodImage, prodName, quantity, oldPrice, newPrice, prodIDs));

                                } else {
                                    long productCuttedPrice = (long) snapshot2.get("productCuttedPrice");
                                    double oldProdPrice = (double) productCuttedPrice;
                                    basketProductsModelList.add(new BasketProductsModel(prodImage, prodName, quantity, oldPrice, oldProdPrice, prodIDs));
                                }
                                cartItemModelsList.add(new CartItemModel(basketProductsModelList, R.drawable.puregold, 0, "Puregold", "", "", 0));
                                CartAdapter cartAdapter = new CartAdapter(cartItemModelsList);
                                cartItemRecyclerView.setAdapter(cartAdapter);
                                cartAdapter.notifyDataSetChanged();
                            }
                        }
                    });
                }
            }
        });


 private void finalData(final finalCallback finalCallback){
        readData(new FirestireCallback() {
            @Override
            public void onCallback(List<String> storeIDS, String uid) {

                for (int n = 0; n < storeIDS.size(); n++){
                    String storeID = storeIDS.get(n);
                    db.collection("Baskets").document(uid).collection("Store_Baskets")
                            .document(storeID).collection("Basket_Products").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> task) {
                            if (task.isSuccessful()){
                                List<String> prodID = new ArrayList<>();
                                List<Integer> prodQuan = new ArrayList<>();
                                for (DocumentSnapshot snapshot: task.getResult()){
                                    String id = snapshot.getId();
                                    long productQuantity = (long) snapshot.get("productQuantity");
                                    final int quantity = (int) productQuantity;

                                    prodID.add(id);
                                    prodQuan.add(quantity);
                                }
                                finalCallback.onCallback(prodID, prodQuan);
                            }
                        }
                    });
                }

            }
        });
    }

    private void readData(final FirestireCallback firestireCallback){
        Intent intent = getIntent();
        final String UserID = intent.getStringExtra("userid");

        db.collection("Buyers")
                .whereEqualTo("buyerID", UserID)
                .limit(1)
                .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()){
                    String uid = "";
                    for (DocumentSnapshot snapshot: task.getResult()){
                        uid = snapshot.getId();
                    }
                    final String finalUid = uid;
                    db.collection("Baskets").document(uid).collection("Store_Baskets")
                            .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> task) {
                            if (task.isSuccessful()){
                                List<String> storeIDs = new ArrayList<>();
                                for (DocumentSnapshot snapshot: task.getResult()){
                                    String storeID = snapshot.getId();
                                    storeIDs.add(storeID);
                                }
                                firestireCallback.onCallback(storeIDs, finalUid);
                            }
                        }
                    });
                }
            }
        });
    }

    private interface finalCallback {
        void onCallback(List<String> prodID, List<Integer> prodQuantity);
    }

    private interface FirestireCallback {
        void onCallback(List<String> storeIDS, String uid);
    }

标签: androidmethodscallbackgoogle-cloud-firestore

解决方案


推荐阅读