简体   繁体   中英

Deletion of Node is not working in Firebase Realtime Database in Android Java

I am making an application in which products are inserted into the database and I am inserting the 1 product once. it is working fine. But when I delete a specific node/ product from Database. deletion code is also working fine but at the same time product is again adding into the database.

Main Fragment Code;

public class Products_fragment extends Fragment {
    FloatingActionButton fab_addproduct;
    RecyclerView recyclerView;
    EditText searchview;
    BottomSheetDialog bottomSheetDialog;
    FirebaseDatabase firebaseDatabase;
    ArrayList<Product_model> DatabaseProductlist;
    FirebaseAuth auth;
    CircularDotsLoader ProgressBar;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_products_fragment, container, false);

        setviews(view);
        setInitilization();
        setclicks();
        setadapter();

        return view;
    }

    private void setInitilization() {
        DatabaseProductlist = new ArrayList<>();
    }

    private void setadapter() {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        FirebaseUser currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();

        assert currentFirebaseUser != null;
        String UID = currentFirebaseUser.getUid();
        DatabaseReference reference  = database.getReference("Users").child(UID).child("Products");

        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @SuppressLint("NotifyDataSetChanged")
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                ProgressBar.setVisibility(View.GONE);
                DatabaseProductlist.clear();
                for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                    Product_model model = dataSnapshot.getValue(Product_model.class);
                    DatabaseProductlist.add(model);
                }
                Product_Adapter product_adapter = new Product_Adapter(DatabaseProductlist);
                recyclerView.setAdapter(product_adapter);
                product_adapter.notifyDataSetChanged();

            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                ToastUtility.showErrorToast(getContext(), error.getMessage());
            }
        });
    }

    private void setclicks() {

    fab_addproduct.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            bottomSheetDialog = new BottomSheetDialog(getContext(), R.style.AppBottomSheetDialogTheme);
            bottomSheetDialog.setContentView(R.layout.productadd_bottom_sheet);
            TextInputEditText product_id = bottomSheetDialog.findViewById(R.id.product_id);
            TextInputEditText product_name = bottomSheetDialog.findViewById(R.id.product_name);
            TextInputEditText product_quantity = bottomSheetDialog.findViewById(R.id.product_quantity);
            MaterialButton add_btn = bottomSheetDialog.findViewById(R.id.add_btn);
            TextInputEditText product_price = bottomSheetDialog.findViewById(R.id.product_price);

            add_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (Objects.requireNonNull(product_name.getText()).toString().isEmpty() || product_id.getText().toString().isEmpty() || product_price.getText().toString().isEmpty() || product_quantity.getText().toString().isEmpty()) {
                        ToastUtility.showErrorToast(getContext(), "Please Fill all Fields");
                    } else {


                        Product_model model = new Product_model(Integer.parseInt(product_id.getText().toString()), Integer.parseInt(product_quantity.getText().toString()), Integer.parseInt(product_price.getText().toString()), product_name.getText().toString());
                        firebaseDatabase = FirebaseDatabase.getInstance();
                        DatabaseReference reference = firebaseDatabase.getReference("Users");

                        FirebaseUser currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();

                        assert currentFirebaseUser != null;
                        String UID = currentFirebaseUser.getUid();
                        reference.child(UID).child("Products").addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot snapshot) {
                                if (snapshot.child(product_name.getText().toString().trim()).exists()) {
                                    ToastUtility.showErrorToast(getContext(),"Product Already Exists!");
                                }
                                else{

                                    reference.child(UID).child("Products").child(product_name.getText().toString().trim()).setValue(model).addOnCompleteListener(new OnCompleteListener<Void>() {
                                        @Override
                                        public void onComplete(@NonNull Task<Void> task) {
                                            if(task.isSuccessful()){
                                                ToastUtility.showSuccessToast(getContext(),"Successfully Added");
                                                setadapter();
                                            }
                                            else{
                                                ToastUtility.showErrorToast(getContext(), Objects.requireNonNull(task.getException()).getMessage());
                                            }
                                        }
                                    });
                                }
                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError error) {
                                ToastUtility.showErrorToast(getContext(),error.getMessage());
                            }
                        });
                    }
                }
            });

            bottomSheetDialog.show();
        }
    });
    }

    private void setviews(View view) {
        recyclerView = view.findViewById(R.id.recyclerView);
        fab_addproduct = view.findViewById(R.id.fab_addproduct);
        searchview = view.findViewById(R.id.searchview);
        ProgressBar = view.findViewById(R.id.progressbar);
    }
}

Adapter Code:

public class Product_Adapter extends RecyclerView.Adapter<Product_Adapter.myviewholder> {
    ArrayList<Product_model> dataholder;

    public Product_Adapter(ArrayList<Product_model> dataholder) {
        this.dataholder = dataholder;
    }

    @NonNull
    @Override
    public myviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.singlerow_product, parent, false);
        return new myviewholder(view);    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull myviewholder holder, int position) {
        holder.idtv.setText("" + dataholder.get(position).getId());
        holder.pnametv.setText("" + dataholder.get(position).getProduct_name());
        holder.pqtytv.setText("" + dataholder.get(position).getProduct_quantity());
        holder.ppritv.setText("" + dataholder.get(position).getProduct_price());

        holder.delimg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                FirebaseDatabase db = FirebaseDatabase.getInstance();
                FirebaseUser curUser = FirebaseAuth.getInstance().getCurrentUser();
                assert curUser != null;
                String UID = curUser.getUid();
                String productname = dataholder.get(holder.getAdapterPosition()).getProduct_name();
                DatabaseReference reference  = db.getReference("Users").child(UID).child("Products");

                reference.child(productname).setValue(null).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if(task.isSuccessful())
                        {
                            ToastUtility.showSuccessToast(view.getContext(),"Suucessfully Deleted");
                            notifyItemRemoved(holder.getAdapterPosition());
                        }
                        else
                        {
                            ToastUtility.showErrorToast(view.getContext(),"Product is not deleting ");
                        }

                    }
                });
            }
        });
    }

    @Override
    public int getItemCount() {
        return dataholder.size();
    }

    static class myviewholder extends RecyclerView.ViewHolder{
        TextView idtv, pnametv, pqtytv, ppritv, delimg, edit_img;
        public myviewholder(@NonNull View itemView) {
            super(itemView);
            idtv = itemView.findViewById(R.id.idtv);
            pnametv = itemView.findViewById(R.id.pnametv);
            pqtytv = itemView.findViewById(R.id.pqtytv);
            ppritv = itemView.findViewById(R.id.ppritv);
            delimg = itemView.findViewById(R.id.delimg);
            edit_img = itemView.findViewById(R.id.edit_img);
        }
    }
}

When you click delete, shouldn't you remove your item from the list before notifying data changed:

//this code belongs to the part where you click the delete

.........   
reference.child(productname).setValue(null).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful())
{
ToastUtility.showSuccessToast(view.getContext(),"Suucessfully Deleted");

//here remove the item from your list
dataholder.remove(holder.getAdapterPosition());

//then notify the adapter
notifyItemRemoved(holder.getAdapterPosition());

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM