繁体   English   中英

Android Recyclerview 刷新问题(Firebase Firestore)

[英]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.

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