1

In my application, it shows the necessary information that I need to show in the reRecyclerView but when I am trying to delete the one catalog of those it didn't happen. But its execute the Item removed phrase and that catalog still there. I need to remove those catalog from there. It doesn't matter that those data still remain on the database because I just wanna delete the catalog. Does anyone know how to fix the issue? Thank you

image

Firebase Database

firebase database

this is the full code.


package com.example.policeemergencysystem;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.example.policeemergencysystem.Model.AdminOrders;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.firebase.ui.database.FirebaseRecyclerAdapter;

public class AdminCategoryActivity extends AppCompatActivity {

    private RecyclerView ordersList;
    private DatabaseReference ordersRef, adminRef, mapRef;
    private Button backBtn;
    private String userID = "", userNAME = "", userPHONE = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admin_category);

        userID = getIntent().getStringExtra("uid");
        userNAME = getIntent().getStringExtra("uname");
        userPHONE = getIntent().getStringExtra("uphone");
        ordersRef = FirebaseDatabase.getInstance().getReference().child("Users");
        adminRef = FirebaseDatabase.getInstance().getReference().child("Location");
        ordersList = findViewById(R.id.ordersList);
        ordersList.setLayoutManager(new LinearLayoutManager(this));
    }

    @Override
    protected void onStart()
    {
        super.onStart();
        FirebaseRecyclerOptions<AdminOrders> options =
                new FirebaseRecyclerOptions.Builder<AdminOrders>()
                        .setQuery(ordersRef, AdminOrders.class)
                        .build();

        FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder> adapter =
                new FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder>(options) {
                    @Override
                    protected void onBindViewHolder(@NonNull final AdminOrdersViewHolder holder, final int position, final @NonNull AdminOrders model)
                    {
                        holder.userName.setText("Name : "+ model.getName());
                        holder.userPhoneNumber.setText("Phone Number : "+ model.getPhone());
                        holder.viewLocationBtn.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                String uID = getRef(position).getKey();
                                String uNAME = getRef(position).getKey();
                                String uPHONE = getRef(position).getKey();
                                Intent intent = new Intent(AdminCategoryActivity.this, AdminViewMapsActivity.class);
                                intent.putExtra("uid", uID);
                                intent.putExtra("uname", uNAME);
                                intent.putExtra("uphone", uPHONE);
                                startActivity(intent);
                            }
                        });
                        holder.itemView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view)
                            {
                                CharSequence options[] = new CharSequence[]
                                        {
                                                "Yes",
                                                "No"
                                        };
                                AlertDialog.Builder builder = new AlertDialog.Builder(AdminCategoryActivity.this);
                                builder.setTitle("Are you done with this case?");
                                builder.setItems(options, new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialogInterface, int i)
                                    {
                                        if(i ==0)
                                        {
                                            String uID = getRef(position).getKey();
                                            RemoveOrder(uID);
                                        }
                                        else
                                        {
                                            finish();
                                        }
                                        adminRef.removeValue()
                                                .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                    @Override
                                                    public void onComplete(@NonNull Task<Void> task)
                                                    {
                                                        if(task.isSuccessful())
                                                        {
                                                            Toast.makeText(AdminCategoryActivity.this, "Item removed", Toast.LENGTH_SHORT).show();
                                                            finish();
                                                            startActivity(getIntent());
                                                        }
                                                    }
                                                });
                                    }
                                });
                                builder.show();
                            }
                        });
                    }

                    @NonNull
                    @Override
                    public AdminOrdersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i)
                    {
                        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.orders_layout, parent, false);
                        return new AdminOrdersViewHolder(view);
                    }
                };
        ordersList.setAdapter(adapter);
        adapter.startListening();
    }

    public static class AdminOrdersViewHolder extends RecyclerView.ViewHolder
    {
        public TextView userName, userPhoneNumber;
        public Button viewLocationBtn;
        public AdminOrdersViewHolder (View itemView)
        {
            super(itemView);
            userName = itemView.findViewById(R.id.userName);
            userPhoneNumber = itemView.findViewById(R.id.userPhoneNumber);
            viewLocationBtn = itemView.findViewById(R.id.viewLocationBtn);
        }
    }
    private void RemoveOrder(String uID)
    {
        adminRef.child(uID).removeValue();
    }
}

Good man
  • 33
  • 7
  • Does this answer your question? [IndexOutOfBoundsException whenever I want to delete an RecyclerView item](https://stackoverflow.com/questions/61825924/indexoutofboundsexception-whenever-i-want-to-delete-an-recyclerview-item) – Aditya Kurkure May 20 '20 at 13:38
  • I know that is the working answer but according to my code, it is not working somehow that is the issue. So I am waiting for the correct answer until someone helps me. – Good man May 20 '20 at 15:04
  • Add a screenshot of the database. – Hasan Bou Taam May 20 '20 at 19:12
  • I just uploaded the firebase database image. – Good man May 20 '20 at 19:39

2 Answers2

1
 FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder> adapter;

in your onStart() method :

adapter =new FirebaseRecyclerAdapter ....

call notifyItemRemoved(position) after remove item :

 private void RemoveOrder(String uID)
    {
        adminRef.child(uID).removeValue();

        adpater.notifyItemRemoved(position);
    }

or if you have more changes(like update, insert) you can use

notifyDataSetChanged()

adpater.notifyDataSetChanged()
mohosyny
  • 962
  • 1
  • 9
  • 19
1

first of all I must say that your code is not right! BTW this is your edited code :

 package com.example.policeemergencysystem;

    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AlertDialog;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.recyclerview.widget.RecyclerView;

    import android.content.DialogInterface;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.Switch;
    import android.widget.TextView;
    import android.widget.Toast;

    import com.example.policeemergencysystem.Model.AdminOrders;
    import com.firebase.ui.database.FirebaseRecyclerOptions;
    import com.google.android.gms.tasks.OnCompleteListener;
    import com.google.android.gms.tasks.Task;
    import com.google.firebase.database.DatabaseReference;
    import com.google.firebase.database.FirebaseDatabase;
    import com.firebase.ui.database.FirebaseRecyclerAdapter;

    public class AdminCategoryActivity extends AppCompatActivity {

        private RecyclerView ordersList;
        private DatabaseReference ordersRef, adminRef, mapRef;
        private Button backBtn;
        private String userID = "", userNAME = "", userPHONE = "";
        private FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder> adapter;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_admin_category);

            userID = getIntent().getStringExtra("uid");
            userNAME = getIntent().getStringExtra("uname");
            userPHONE = getIntent().getStringExtra("uphone");
            ordersRef = FirebaseDatabase.getInstance().getReference().child("Users");
            adminRef = FirebaseDatabase.getInstance().getReference().child("Location");
            ordersList = findViewById(R.id.ordersList);
            ordersList.setLayoutManager(new LinearLayoutManager(this));
        }

        @Override
        protected void onStart()
        {
            super.onStart();
            FirebaseRecyclerOptions<AdminOrders> options =
                    new FirebaseRecyclerOptions.Builder<AdminOrders>()
                            .setQuery(ordersRef, AdminOrders.class)
                            .build();

           adapter  =
                    new FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder>(options) {
                        @Override
                        protected void onBindViewHolder(@NonNull final AdminOrdersViewHolder holder, final int position, final @NonNull AdminOrders model)
                        {
                            holder.userName.setText("Name : "+ model.getName());
                            holder.userPhoneNumber.setText("Phone Number : "+ model.getPhone());
                            holder.viewLocationBtn.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    String uID = getRef(position).getKey();
                                    String uNAME = getRef(position).getKey();
                                    String uPHONE = getRef(position).getKey();
                                    Intent intent = new Intent(AdminCategoryActivity.this, AdminViewMapsActivity.class);
                                    intent.putExtra("uid", uID);
                                    intent.putExtra("uname", uNAME);
                                    intent.putExtra("uphone", uPHONE);
                                    startActivity(intent);
                                }
                            });
                            holder.itemView.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view)
                                {
                                    CharSequence options[] = new CharSequence[]
                                            {
                                                    "Yes",
                                                    "No"
                                            };
                                    AlertDialog.Builder builder = new AlertDialog.Builder(AdminCategoryActivity.this);
                                    builder.setTitle("Are you done with this case?");
                                    builder.setItems(options, new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialogInterface, int i)
                                        {
                                            if(i ==0)
                                            {
                                                String uID = getRef(position).getKey();
                                                RemoveOrder(uID);
                                            }
                                            else
                                            {
                                                finish();
                                            }
                                            adminRef.removeValue()     .addOnCompleteListener(newOnCompleteListener<Void>() {
                                                        @Override
                                                        public void onComplete(@NonNull Task<Void> task)
                                                        {
                                                            if(task.isSuccessful())
                                                            {
                                                                Toast.makeText(AdminCategoryActivity.this, "Item removed", Toast.LENGTH_SHORT).show();
                                                                finish();
                                                                startActivity(getIntent());
                                                            }
                                                        }
                                                    });
                                        }
                                    });
                                    builder.show();
                                }
                            });
                        }

                        @NonNull
                        @Override
                        public AdminOrdersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i)
                        {
                            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.orders_layout, parent, false);
                            return new AdminOrdersViewHolder(view);
                        }
                    };
            ordersList.setAdapter(adapter);
            adapter.startListening();
        }

        public static class AdminOrdersViewHolder extends RecyclerView.ViewHolder
        {
            public TextView userName, userPhoneNumber;
            public Button viewLocationBtn;
            public AdminOrdersViewHolder (View itemView)
            {
                super(itemView);
                userName = itemView.findViewById(R.id.userName);
                userPhoneNumber = itemView.findViewById(R.id.userPhoneNumber);
                viewLocationBtn = itemView.findViewById(R.id.viewLocationBtn);
            }
        }

        private void RemoveOrder(String uID)
        {
            adminRef.child(uID).removeValue();
            adapter.notifyDataSetChanged();

        }
    }
mohosyny
  • 962
  • 1
  • 9
  • 19
  • The code doesn't have any error but it's not working. In the firebase database, it just deletes the location only that name and phone number still there. I don't know why :( – Good man May 20 '20 at 17:58