Reputation: 15
I am getting data from Firebase Cloud Firestore to Android Recyclerview.. When i swipe item right to delete item, it deletes item from database but it does not refresh recyclerview! Also same in swipe left too.. Also when i chance data in database recyclerview does not refresh data...
EDIT & SOLUTION
Deleting .whereEqualTo("tamamlandimi", false) fixed all problems.. So i added array in Firebase and problems solved!!
Hatirlatmalar.java
public class Hatirlatmalar extends Fragment {
RecyclerView hRVT;
RCV_HatirlatmalarAdapter hatirlatmalarAdapter;
FloatingActionButton yEG;
Button hatirlatmaKaydet;
TextInputLayout hatirlatmaTarihi, yapilacakIsTipi, kimeYapilacak, yapilacakOlan;
TextInputEditText hT, yIT;
Spinner yapilacakIsTipiSpinner;
ConstraintLayout pBC;
String hTarihi;
private DatePickerDialog.OnDateSetListener hatirlatmaTarihiSecici;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View h = inflater.inflate(R.layout.hatirlatmalar, container, false);
hRVT = h.findViewById(R.id.yapilacaklarTumu);
hatirlatmalarRefC = fs.collection("Kullanıcılar/" + kullanici.getEmail() + "/Hatırlatmalar");
hatirlatmalarGetir();
yEG = h.findViewById(R.id.yEG);
yEG.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.setContentView(R.layout.hatirlatma_ekle);
Objects.requireNonNull(dialog.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
hatirlatmaKaydet = dialog.findViewById(R.id.yapilacakKaydet);
hatirlatmaTarihi = dialog.findViewById(R.id.hatirlatmaTarihi);
yapilacakIsTipi = dialog.findViewById(R.id.yapilacakIsTipi);
kimeYapilacak = dialog.findViewById(R.id.kimeYapilacak);
yapilacakOlan = dialog.findViewById(R.id.yapilacakOlan);
hatirlatmaTarihi.getEditText().setText(bugun);
hT = dialog.findViewById(R.id.hT);
yIT = dialog.findViewById(R.id.yIT);
pBC = dialog.findViewById(R.id.pBC);
yapilacakIsTipiSpinner = dialog.findViewById(R.id.yapilacakIsTipiSpinner);
hT.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DatePickerDialog tS = new DatePickerDialog(
Objects.requireNonNull(getContext()),
android.R.style.Theme_Holo_Dialog_MinWidth,
hatirlatmaTarihiSecici,
yil, ay, gun);
tS.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
Objects.requireNonNull(tS.getWindow()).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
tS.show();
}
});
hatirlatmaTarihiSecici = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
month += 1;
String gun, ay;
if (month < 10) {
ay = "0" + month;
} else {
ay = String.valueOf(month);
}
if (day < 10) {
gun = "0" + day;
} else {
gun = String.valueOf(day);
}
hTarihi = gun + "." + ay + "." + year;
hatirlatmaTarihi.getEditText().setText(hTarihi);
}
};
ArrayAdapter<CharSequence> b = ArrayAdapter.createFromResource(Objects.requireNonNull(getContext()),
R.array.yapilacakIsTipi,
R.layout.saga_dayali);
yapilacakIsTipiSpinner.setAdapter(b);
yIT.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
yapilacakIsTipiSpinner.performClick();
}
});
yapilacakIsTipiSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
yapilacakIsTipi.getEditText().setText(yapilacakIsTipiSpinner.getSelectedItem().toString());
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
hatirlatmaKaydet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
yukleniyorAc();
hTarihi = hatirlatmaTarihi.getEditText().getText().toString();
Date ht = tarihTipi.parse(hTarihi);
Date kt = Calendar.getInstance().getTime();
String yo = yapilacakOlan.getEditText().getText().toString().trim();
String yit = yapilacakIsTipi.getEditText().getText().toString().trim();
String ky = kimeYapilacak.getEditText().getText().toString().trim();
if (!yo.trim().isEmpty()) {
hatirlatmalarRefC.add(new RCV_Hatirlatmalar(false, kt, ht, yo, yit, ky))
.addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
StyleableToast.makeText(getContext(), getString(R.string.hatirlatma_kaydildi), R.style.onayKisaAlt).show();
dialog.dismiss();
// hatirlatmalarGetir(); I'm DOING THIS TO RELOAD RCV!!!
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
StyleableToast.makeText(getContext(), getString(R.string.hatirlatma_kaydlemedi), R.style.hataKisa).show();
}
}).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
@Override
public void onComplete(@NonNull Task<DocumentReference> task) {
yukleniyorKapa();
}
});
}
} catch (ParseException e) {
yukleniyorKapa();
e.printStackTrace();
StyleableToast.makeText(getContext(), getString(R.string.kayityok_tryc), R.style.hataKisa).show();
}
}
});
dialog.show();
}
});
return h;
}
private void hatirlatmalarGetir() {
Query query = hatirlatmalarRefC.whereEqualTo("tamamlandimi", false).orderBy("hatirlatmaTarihi", Query.Direction.DESCENDING);
FirestoreRecyclerOptions<RCV_Hatirlatmalar> options = new FirestoreRecyclerOptions.Builder<RCV_Hatirlatmalar>()
.setQuery(query, RCV_Hatirlatmalar.class)
.build();
hatirlatmalarAdapter = new RCV_HatirlatmalarAdapter(options);
hRVT.setHasFixedSize(true);
hRVT.setLayoutManager(new LinearLayoutManager(getContext()));
hRVT.setAdapter(hatirlatmalarAdapter);
hatirlatmalarAdapter.startListening();
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
if (direction == ItemTouchHelper.LEFT) {
hatirlatmalarAdapter.hatirlatmaTamamla(viewHolder.getAdapterPosition());
hatirlatmalarGetir();
} else {
hatirlatmalarAdapter.hatirlatmaSil(viewHolder.getAdapterPosition());
hatirlatmalarGetir();
}
}
@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
new RecyclerViewSwipeDecorator.Builder(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
.addSwipeRightActionIcon(R.drawable.ic_sil)
.addSwipeLeftActionIcon(R.drawable.ic_tamamlandi)
.addSwipeRightBackgroundColor(ContextCompat.getColor(getContext(), R.color.kirmizi))
.addSwipeLeftBackgroundColor(ContextCompat.getColor(getContext(), R.color.yesil))
.addSwipeRightLabel(getString(R.string.hatirlatma_sil))
.addSwipeLeftLabel(getString(R.string.hatirlatma_tamamla))
.setSwipeRightLabelColor(ContextCompat.getColor(getContext(), R.color.ak))
.setSwipeLeftLabelColor(ContextCompat.getColor(getContext(), R.color.ak))
.create()
.decorate();
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}).attachToRecyclerView(hRVT);
}
public void yukleniyorAc() {
pBC.setVisibility(View.VISIBLE);
}
public void yukleniyorKapa() {
pBC.setVisibility(View.GONE);
}
@Override
public void onStop() {
super.onStop();
hatirlatmalarAdapter.stopListening();
}
@Override
public void onStart() {
super.onStart();
hatirlatmalarAdapter.startListening();
}
}
RCV_HatirlatmalarAdapter.java
public class RCV_HatirlatmalarAdapter extends FirestoreRecyclerAdapter<RCV_Hatirlatmalar, RCV_HatirlatmalarAdapter.RCV_Hatirlatmalar_Holder> {
Context context;
public RCV_HatirlatmalarAdapter(@NonNull FirestoreRecyclerOptions<RCV_Hatirlatmalar> options) {
super(options);
}
/* @Override
public int getItemCount() {
return super.getItemCount();
}
*/
@Override
protected void onBindViewHolder(@NonNull RCV_Hatirlatmalar_Holder holder, int position, @NonNull RCV_Hatirlatmalar model) {
holder.nezaman.setText(tarihTipi.format(model.getHatirlatmaTarihi()));
holder.ne.setText(model.getYapilacakOlan());
holder.kime.setText(model.getKimeYapilacak());
holder.tip.setText(model.getYapilacakIsTipi());
}
@NonNull
@Override
public RCV_Hatirlatmalar_Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rcv_hatirlatmalar,
parent, false);
context = parent.getContext();
return new RCV_Hatirlatmalar_Holder(v);
}
public void hatirlatmaSil(int adapterPosition) {
getSnapshots().getSnapshot(adapterPosition).getReference().delete();
StyleableToast.makeText(context, "Silinidi!", R.style.hataKisaAlt).show();
}
public void hatirlatmaTamamla(int adapterPosition) {
final Map<String, Object> h = new HashMap<>();
h.put("tamamlandimi", true);
getSnapshots().getSnapshot(adapterPosition).getReference().set(h, SetOptions.merge()).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
StyleableToast.makeText(context, "Tamamlandı!", R.style.onayKisaAlt).show();
}
});
}
class RCV_Hatirlatmalar_Holder extends RecyclerView.ViewHolder {
TextView nezaman, ne, kime, tip;
public RCV_Hatirlatmalar_Holder(@NonNull View itemView) {
super(itemView);
nezaman = itemView.findViewById(R.id.nezaman);
ne = itemView.findViewById(R.id.ne);
kime = itemView.findViewById(R.id.kime);
tip = itemView.findViewById(R.id.tip);
}
}
}
Upvotes: 0
Views: 645
Reputation: 363
You are not notifying the adapter about data change. You need to call something like
notifyDataSetChanged()
inside the adapter whenenver data is changing.
or something specific like notifyItemChanged(position)
or notifyItemDeleted(position)
.
More Info about these methods Here, Scroll down to see a complete list of methods depending on the scenario.
In your situation, you need to add this line of code after,
public void hatirlatmaSil(int adapterPosition) {
getSnapshots().getSnapshot(adapterPosition).getReference().delete();
notifyItemRemoved(adapterPosition) ----> Add This
StyleableToast.makeText(context, "Silinidi!", R.style.hataKisaAlt).show();
}
Upvotes: 1