[英]How to display Firebase Firestore users in Android RecyclerView?
[英]Android Recyclerview Refresh Problem (Firebase Firestore)
我正在从 Firebase Cloud Firestore 到 Android Recyclerview 获取数据。当我向右滑动项目以删除项目时,它会从数据库中删除项目,但不会刷新 recyclerview。 向左滑动也一样..另外,当我偶然在数据库recyclerview中的数据不刷新数据时......
编辑和解决方案
Deleting.whereEqualTo("tamamlandimi", false) 修复了所有问题。所以我在 Firebase 中添加了数组,问题解决了!!
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);
}
}
}
您没有通知适配器有关数据更改的信息。 当enver数据发生变化时,您需要在适配器内部调用诸如notifyDataSetChanged()
之类的东西。
或诸如notifyItemChanged(position)
或notifyItemDeleted(position)
类的特定内容。
有关这些方法的更多信息在这里,向下滚动以查看根据场景的方法的完整列表。
在您的情况下,您需要在之后添加这行代码,
public void hatirlatmaSil(int adapterPosition) {
getSnapshots().getSnapshot(adapterPosition).getReference().delete();
notifyItemRemoved(adapterPosition) ----> Add This
StyleableToast.makeText(context, "Silinidi!", R.style.hataKisaAlt).show();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.