children 没有从 firebase 中删除 onclick 事件写在自定义 recyclerview 的 onbindviewholder 中 class

children is not removing from firebase onclick event is written in onbindviewholder in custom recyclerview class

有趣的是,删除完成时写的 toast 正在显示,但 firebase 的值并未删除。

这是我的 UI 图片..

这是我的 onbindviewholder 代码...

  public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        holder.getShopname().setText(list.get(position).getShopname());
        holder.getApmt_date().setText(list.get(position).getAppointment_date());
        Log.d("QWWQ","size="+list.get(position).getServices());
        holder.getServices().setText(list.get(position).getServices().substring(0,list.get(holder.getAdapterPosition()).getServices().indexOf('-'))) ;
        holder.getSlot().setText(list.get(position).getSlot());
        holder.getAmount().setText(list.get(position).getAmount());

        holder.getcancelBtn().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("appointments").addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        for (DataSnapshot datasnapshot: snapshot.getChildren()
                             ) {
                            if(datasnapshot.child("shop_name").getValue(String.class).equals(list.get(holder.getAdapterPosition()).getShopname())){
                                Log.d("CHHH","Users/"+FirebaseAuth.getInstance().getCurrentUser().getUid()+"/"+datasnapshot.getKey()+"/appointment_dates/"+list.get(holder.getAdapterPosition()).getAppointment_date());
                                FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(datasnapshot.getKey()).child("appointment_dates").child(list.get(holder.getAdapterPosition()).getAppointment_date()).removeValue(new DatabaseReference.CompletionListener() {
                                    @Override
                                    public void onComplete(@Nullable DatabaseError error, @NonNull DatabaseReference ref) {
                                        FirebaseDatabase.getInstance().getReference("Shops").child("appointments").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(list.get(holder.getAdapterPosition()).getAppointment_date()).removeValue(new DatabaseReference.CompletionListener() {
                                            @Override
                                            public void onComplete(@Nullable DatabaseError error, @NonNull DatabaseReference ref) {
                                                Toast.makeText(view.getContext(), "Your Appointment With "+list.get(holder.getAdapterPosition()).getShopname()+" has been cancelled!!",Toast.LENGTH_SHORT).show();
                                            }
                                        });

                                    }
                                });
                            }
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {

                    }
                });

            }
        });
    }

Firebase 数据库图像...

您可以使用 .setValue(null) 而不是 .removeValue 从实时数据库中删除项目。

不要忽略从调用的 API 返回的错误。

在对 removeValue 的调用中,您需要检查 error 是否不是 null,并记录它:

public void onComplete(@Nullable DatabaseError error, @NonNull DatabaseReference ref) {
    if (error != null) {
        Log.e("Firebase", "Error deleting node", error);
    } else {
        Toast.makeText(view.getContext(), "Your Appointment With "+list.get(holder.getAdapterPosition()).getShopname()+" has been cancelled!!",Toast.LENGTH_SHORT).show();
    }
}

并且在您的听众中,您永远不应将 onCancelled 留空。至少应该是

@Override
public void onCancelled(@NonNull DatabaseError error) {
    throw error.toException();
}

一旦你能读懂错误,你就能找出问题的根本原因。

我给出了从 firebase 中删除该节点的错误路径(不存在的路径),因此在更正后我得到了我需要的结果。 (注意:如果你给出错误的路径,仍然写在 remove valueoncomplete 中的 Toast 将 运行。)