'Firestore Recyclerview item doesn't update when doing add, update, delete data

I have a problem when doing add, update, and delete with my firestore recyclerview. The problem is my recyclerview item updating automatically when doing add, update, and delete. But when I open my firestore , my data already updating. I already added notifydatasetchange method but still, can't solve my problem. Here is my adapter code

public class SMPAdapter extends RecyclerView.Adapter<SMPAdapter.MyViewHolder> {
private List<SMPModel> smpModelList;
private Fragment fragment;
private FirebaseStorage firebaseStorage;
private FirebaseFirestore firebaseFirestore;

public SMPAdapter(List<SMPModel> smpModelList, Fragment fragment) {
    this.smpModelList = smpModelList;
    this.fragment = fragment;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
    View view = layoutInflater.inflate(R.layout.smp_item, parent, false);
    firebaseStorage = FirebaseStorage.getInstance();
    firebaseFirestore = FirebaseFirestore.getInstance();
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int position) {
    final SMPModel smpModel = smpModelList.get(position);
    final String logoURL = smpModel.getLogoURL();

    if (logoURL != null) {
        Picasso.get().load(logoURL).placeholder(R.drawable.logo_progress_bar).into(myViewHolder.imageViewLogoItem);
    } else {
        myViewHolder.imageViewLogoItem.setImageResource(R.drawable.icon_tanpa_gambar);
    }
    myViewHolder.textViewNamaSMPItem.setText(smpModel.getNamaSMP());
    myViewHolder.textViewAlamatItem.setText(smpModel.getAlamat());

    myViewHolder.cardViewOptionItem.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            PopupMenu popupMenu = new PopupMenu(fragment.getActivity(), myViewHolder.cardViewOptionItem);
            popupMenu.inflate(R.menu.option_menu);
            popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem menuItem) {
                    switch (menuItem.getItemId()) {
                        // Menampilkan menu edit
                        case R.id.optionMenuEdit:
                            // Berpindah ke EditDataActivity dan meneruskan data
                            Intent intentEditData = new Intent(fragment.getActivity(), EditDataActivity.class);
                            intentEditData.putExtra("id", smpModel.getId());
                            intentEditData.putExtra("logoURL", smpModel.getLogoURL());
                            intentEditData.putExtra("namaSMP", smpModel.getNamaSMP());
                            intentEditData.putExtra("alamat", smpModel.getAlamat());
                            intentEditData.putExtra("kecamatan", smpModel.getKecamatan());
                            intentEditData.putExtra("status", smpModel.getStatus());
                            intentEditData.putExtra("latitude", smpModel.getLatitude().toString());
                            intentEditData.putExtra("longitude", smpModel.getLongitude().toString());
                            fragment.startActivity(intentEditData);
                            break;
                        // Menampilkan menu hapus
                        case R.id.optionMenuHapus:
                            // Menampilkan pesan "Yakin ingin menghapus?"
                            AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getActivity());
                            builder.setMessage("Yakin ingin menghapus?");
                            builder.setCancelable(true);

                            builder.setPositiveButton("Ya", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    Toast.makeText(fragment.getActivity(), "Data telah dihapus!", Toast.LENGTH_SHORT).show();
                                    firebaseFirestore.collection("SMP").document(smpModel.getId()).delete();
                                    if (smpModel.getLogoURL() != null) {
                                        firebaseStorage.getReferenceFromUrl(smpModel.getLogoURL()).delete();
                                    }
                                    // Menghapus item pada RecyclerView
                                    smpModelList.remove(myViewHolder.getAdapterPosition());
                                    notifyItemRemoved(myViewHolder.getAdapterPosition());
                                    notifyItemChanged(myViewHolder.getAdapterPosition(), smpModelList.size());
                                    dialogInterface.cancel();
                                }
                            });
                            builder.setNegativeButton("Tidak", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    dialogInterface.cancel();
                                }
                            });
                            AlertDialog alertDialog = builder.create();
                            alertDialog.show();
                            break;
                    }
                    return false;
                }
            });
            popupMenu.show();
        }
    });
}

and below is my data_fragment

@Override
public int getItemCount() {
    // Memeriksa jumlah data pada variabel smpModelList
    return smpModelList.size();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_data, container, false);
    // Inisialisasi variabel
    textViewDataJumlahData = view.findViewById(R.id.textViewDataJumlahData);
    searchViewData = view.findViewById(R.id.searchViewData);
    recyclerViewSMP = view.findViewById(R.id.recyclerViewSMP);
    firebaseFirestore = FirebaseFirestore.getInstance();

    smpModelArrayList = new ArrayList<>();
    smpAdapter = new SMPAdapter(smpModelArrayList, DataFragment.this);

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this.getActivity(), LinearLayoutManager.VERTICAL, false);
    recyclerViewSMP.setLayoutManager(linearLayoutManager);
    recyclerViewSMP.setAdapter(smpAdapter);

    firebaseFirestore.collection("SMP").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @SuppressLint("NotifyDataSetChanged")
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            smpModelArrayList.clear();
            if (task.isSuccessful()) {
                int size = task.getResult().size();
                String jumlahData = Long.toString(size);
                textViewDataJumlahData.setText(jumlahData);

                for (DocumentSnapshot documentSnapshot : task.getResult()) {
                        SMPModel smpModel = documentSnapshot.toObject(SMPModel.class);
                        smpModel.setId(documentSnapshot.getId());
                        smpModelArrayList.add(smpModel);
                    }
                smpAdapter.notifyDataSetChanged();
            }
            else {
                Toast.makeText(getActivity(), "Gagal mengambil data!", Toast.LENGTH_SHORT).show();
            }
        }
    });

    if (searchViewData != null) {
        searchViewData.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                ArrayList<SMPModel> searchSMPModelArrayList = new ArrayList<>();
                for (SMPModel smpModel : smpModelArrayList) {
                    if (smpModel.getNamaSMP().toLowerCase().contains(s.toLowerCase())) {
                        searchSMPModelArrayList.add(smpModel);
                    }
                }
                SMPAdapter smpAdapter = new SMPAdapter(searchSMPModelArrayList, DataFragment.this);
                recyclerViewSMP.setAdapter(smpAdapter);
                return true;
            }
        });
    }
    return view;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    setHasOptionsMenu(true);
    super.onCreate(savedInstanceState);
}

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
    inflater.inflate(R.menu.tambah_data_menu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.menuTambahData) {
        Intent intent = new Intent(getActivity(), TambahDataActivity.class);
        startActivity(intent);
        searchViewData.clearFocus();
    }
    return super.onOptionsItemSelected(item);
}

}



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source