【问题标题】:Selecting in RecyclerView and delete from firebase in java在 RecyclerView 中选择并从 java 中的 firebase 中删除
【发布时间】:2021-12-29 00:12:39
【问题描述】:

我想从 Firebase 中删除我的文档。但首先我需要确定文档 ID。我试图获取文档 ID:

docId = queryDocumentSnapshots.getDocuments().get(pos).getId();

然后,我只想删除我的文档。但是firebase异步工作,所以代码在'if'语句中不起作用。当我们第一次单击按钮时,docId 变量为 null 或者它采用之前单击的 docId,直到异步代码部分完成。

    @Override
    public void onBindViewHolder(@NonNull AdvertisementHolder holder, int position) {
        imgUrl = publishedAdvertisements.get(position).getImgUrl();

        holder.petName.setText(publishedAdvertisements.get(position).getPetName());
        holder.petCategory.setText(publishedAdvertisements.get(position).getPetCategory());
        Picasso.get().load(publishedAdvertisements.get(position).getImgUrl()).into(holder.petImage);
        holder.btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                firebaseFirestore = FirebaseFirestore.getInstance();
                firebaseFirestore.collection("Pets").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(@NonNull QuerySnapshot queryDocumentSnapshots) {
                        if (!queryDocumentSnapshots.isEmpty()) {
                            System.out.println("bos döndü");
                            docId = queryDocumentSnapshots.getDocuments().get(pos).getId();
                        }
                    }
                });


                System.out.println(docId);

                if (docId != null) {
                    FirebaseFirestore db = FirebaseFirestore.getInstance();
                    db.collection("Pets").document(docId)
                            .delete()
                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    Log.d(TAG, "DocumentSnapshot successfully deleted!");
                                    publishedAdvertisements.clear();
                                    getPublishedAnimals();
                                }
                            })
                            .addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Log.w(TAG, "Error deleting document", e);
                                }
                            });

                }
                notifyDataSetChanged();
            }

        });

【问题讨论】:

标签: java android firebase android-recyclerview


【解决方案1】:

您应该对代码进行结构化,以便在响应回调中执行或触发任何依赖于异步操作的逻辑。

你可以这样做:

@Override
public void onBindViewHolder(@NonNull AdvertisementHolder holder, int position) {
    imgUrl = publishedAdvertisements.get(position).getImgUrl();

    holder.petName.setText(publishedAdvertisements.get(position).getPetName());
    holder.petCategory.setText(publishedAdvertisements.get(position).getPetCategory());
    Picasso.get().load(publishedAdvertisements.get(position).getImgUrl()).into(holder.petImage);
    holder.btnDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            firebaseFirestore = FirebaseFirestore.getInstance();
            firebaseFirestore.collection("Pets").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(@NonNull QuerySnapshot queryDocumentSnapshots) {
                    // The asynchronous operation has successfully completed 
                    // and returned a value to our 'onSuccess()' callback.
                    if (!queryDocumentSnapshots.isEmpty()) {
                        System.out.println("bos döndü");
                        docId = queryDocumentSnapshots.getDocuments().get(pos).getId();
                        
                        System.out.println(docId);

                        // We can now use the value of docId.
                        if (docId != null) {
                            FirebaseFirestore db = FirebaseFirestore.getInstance();
                            db.collection("Pets").document(docId)
                                    .delete()
                                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                                        @Override
                                        public void onSuccess(Void aVoid) {
                                            Log.d(TAG, "DocumentSnapshot successfully deleted!");
                                            publishedAdvertisements.clear();
                                            getPublishedAnimals();
                                            
                                            // (1)
                                        }
                                    })
                                    .addOnFailureListener(new OnFailureListener() {
                                        @Override
                                        public void onFailure(@NonNull Exception e) {
                                            Log.w(TAG, "Error deleting document", e);
                                        }
                                    });
                        }
                        
                        // I'm not sure how your RecyclerView is set up 
                        // but I'm guessing you might want to move this call
                        // to 'notifyDataSetChanged()' to the section marked (1)
                        notifyDataSetChanged();
                    }
                }
            });
        }

    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    相关资源
    最近更新 更多