【问题标题】:Android Recyclerview Refresh Problem (Firebase Firestore)Android Recyclerview 刷新问题(Firebase Firestore)
【发布时间】:2021-01-02 14:53:28
【问题描述】:

我正在从 Firebase Cloud Firestore 获取数据到 Android Recyclerview.. 当我向右滑动项目以删除项目时,它会从数据库中删除项目,但不会刷新 recyclerview! 向左滑动也一样.. 另外,当我偶然发现数据库 recyclerview 中的数据不刷新数据时...

It stays like this..

编辑和解决方案

删除 .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);

        }
    }
}

【问题讨论】:

  • 实现 'com.firebaseui:firebase-ui-firestore:7.1.1'
  • 如果您遇到问题,最好在发布问题时创建MCVE。您为此问题发布了近 600 行代码。人们需要解析和尝试在线调试的内容很多。请编辑您的问题并隔离问题,这样可以增加获得帮助的机会。
  • 啊,好吧。我会尝试编辑它...

标签: java android firebase android-recyclerview google-cloud-firestore


【解决方案1】:

您没有通知适配器数据更改。你需要调用类似的东西 notifyDataSetChanged() 在适配器内当enver 数据发生变化时。

或类似notifyItemChanged(position)notifyItemDeleted(position) 之类的特定内容。

关于这些方法的更多信息Here,向下滚动以查看取决于场景的完整方法列表。

根据你的情况,需要在后面加上这行代码,

  public void hatirlatmaSil(int adapterPosition) {

    getSnapshots().getSnapshot(adapterPosition).getReference().delete();
    notifyItemRemoved(adapterPosition)  ----> Add This 

    StyleableToast.makeText(context, "Silinidi!", R.style.hataKisaAlt).show();

}

【讨论】:

  • 感谢您的回答,但是; notifyDataSetChanged(); - 没有任何机会。 notifyItemRemoved(adapterPosition) - 移动行但行同时返回...
  • 我很惊讶......当我删除 whereEqualTo("tamamlandimi", false) 而不添加新代码时,它工作了......是时候搜索这个了,哈哈
猜你喜欢
  • 1970-01-01
  • 2017-11-11
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多