回收视图继续加载已删除的项目

时间:2019-08-31 15:11:11

标签: java android firebase android-recyclerview adapter

我有以下代码可以将Firebase Firestore中的数据加载和筛选到回收视图,该视图可以加载所有筛选的数据,一切正常,但是,当我从搜索列表中删除所选项目时,它确实删除了从网络上的Firestore数据中删除,但在删除后仍由搜索回收视图加载,看起来Adatper仍然具有数据,并且在删除后没有删除它,请查看以下两个deletenote()中的代码和getnotes()方法:-

package com.example.boc.main;

import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.blogspot.atifsoftwares.animatoolib.Animatoo;
import com.example.boc.PhoneNumbers.NoteRecyclerViewAdapter;
import com.example.boc.PhoneNumbers.ViewNoteDialog;
import com.example.boc.models.Search;
import com.example.boc.search.SearchRecyclerViewAdapter;
import com.example.boc.R;
import com.example.boc.Interface.IMainActivity;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.ArrayList;

import com.example.boc.models.Note;

/**
 * Created by User on 5/14/2018.
 */

public class Search_test extends AppCompatActivity implements
        View.OnClickListener,
        IMainActivity,
        SwipeRefreshLayout.OnRefreshListener {

    private static final String TAG = "MainActivity";

    //Firebase
    private FirebaseAuth.AuthStateListener mAuthListener;

    //widgets
    private FloatingActionButton mFab, mFab2;
    private RecyclerView mRecyclerView;
    private SwipeRefreshLayout mSwipeRefreshLayout;
    public FirebaseFirestore db = FirebaseFirestore.getInstance();

    //vars
    private View mParentLayout;
    private ArrayList<Search> mSearch = new ArrayList<>();
    private ArrayList<Note> mNotes = new ArrayList<>();
    private DocumentReference noteRef = db.collection("notes").document();
    private CollectionReference notesCollectionRef = db.collection("notes");
    private NoteRecyclerViewAdapter mNoteRecyclerViewAdapter;
    private SearchRecyclerViewAdapter mSearchRecyclerViewAdapter;
    private DocumentSnapshot mLastQueriedDocument;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.search_recycler);
        mParentLayout = findViewById(android.R.id.content);
        mRecyclerView = findViewById(R.id.recycler_view_search);
        EditText userinput = findViewById(R.id.userInputtxt);


        initRecyclerView();
        getNotes();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Animatoo.animateFade(Search_test.this); //fire the slide left animation
    }


    @Override
    public boolean onCreatOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.toolbar, menu);

        return true;
    }

    @Override
    public void deleteNote(final Note note) {
        FirebaseFirestore db = FirebaseFirestore.getInstance();

        DocumentReference noteRef = db
                .collection("notes").document(note.getNote_id());

        noteRef.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    makeSnackBarMessage("Deleted note");

                    mRecyclerView.setAdapter(null);// trying to make the recycle view remove the adapter but still loading the old list //


                } else {
                    makeSnackBarMessage("Failed. Check log.");
                }
            }
        });
    }

    @Override
    public void onRefresh() {
    }

    private void getNotes() {

        FirebaseFirestore db = FirebaseFirestore.getInstance();
        final EditText userinput = findViewById(R.id.userInputtxt);

        CollectionReference notesCollectionRef = db
                .collection("notes");

        Query notesQuery = null;
        if (mLastQueriedDocument != null) {

            notesQuery = notesCollectionRef
                    .orderBy("timestamp", Query.Direction.ASCENDING);
        } else {
            notesQuery = notesCollectionRef
                    .orderBy("timestamp", Query.Direction.ASCENDING);
        }

        notesQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    String data = "";

                    for (final QueryDocumentSnapshot document : task.getResult()) {
                        Note note = document.toObject(Note.class);

                        mNotes.add(note);

                        if (userinput == null) {
                            mRecyclerView.setAdapter(null);

                        }

                        if (userinput != null) {

                            userinput.addTextChangedListener(
                                    new TextWatcher() {
                                        @Override
                                        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                                        }

                                        @Override
                                        public void afterTextChanged(Editable s) {

                                        }

                                        @Override
                                        public void onTextChanged(CharSequence s, int start, int before, int count) {

                                            final String userinputString = userinput.getText().toString();
                                            mSearch.clear();

                                            for (Note note : mNotes) {
                                                if (note.getTitle().contains(userinputString)) {

                                                    if (note != null) {

                                                        mSearch.add(note);

                                                        mSearchRecyclerViewAdapter = new SearchRecyclerViewAdapter(Search_test.this, mSearch);
                                                        mRecyclerView.setLayoutManager(new LinearLayoutManager(Search_test.this));
                                                        mRecyclerView.setAdapter(mSearchRecyclerViewAdapter);
                                                        mSearchRecyclerViewAdapter.notifyDataSetChanged();
                                                    }


                                                }


                                            }


                                        }


                                    }

                            );


                        }


                    }


                    if (task.getResult().size() != 0) {
                        mLastQueriedDocument = task.getResult().getDocuments()
                                .get(task.getResult().size() - 1);
                    }
                    mSearchRecyclerViewAdapter.notifyDataSetChanged();

                } else {
                    makeSnackBarMessage("Query Failed. Check Logs.");
                }
            }
        });
    }

    private void initRecyclerView() {
        if (mNoteRecyclerViewAdapter == null) {
            mSearchRecyclerViewAdapter = new SearchRecyclerViewAdapter(this, mSearch);
        }
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setAdapter(mSearchRecyclerViewAdapter);
    }

    @Override
    public void updateNote(final Note note) {

        FirebaseFirestore db = FirebaseFirestore.getInstance();

        DocumentReference noteRef = db
                .collection("notes")
                .document(note.getNote_id());

        noteRef.update(
                "title", note.getTitle(),
                "content", note.getContent(), "pos", note.getpos()
        ).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    makeSnackBarMessage(" تم تحديث المعلومات");
                } else {
                    makeSnackBarMessage("حدث خطأ , يرجى اعادة المحاولة");
                }
            }
        });
    }

    @Override
    public void onNoteSelected(Note note) {
        ViewNoteDialog dialog = ViewNoteDialog.newInstance(note);
        dialog.show(getSupportFragmentManager(), getString(R.string.dialog_view_note));
    }

    @Override
    public void createNewNote(String title, String content, String pos) {

        FirebaseFirestore db = FirebaseFirestore.getInstance();

        String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();

        DocumentReference newNoteRef = db
                .collection("notes")
                .document();

        Note note = new Note();
        note.setTitle(title);
        note.setContent(content);
        note.setPos(pos);
        note.setNote_id(newNoteRef.getId());
        note.setUser_id(userId);

        newNoteRef.set(note).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    makeSnackBarMessage("تمت اضافة رقم الهاتف للسجل");
                    getNotes();
                } else {
                    makeSnackBarMessage(" يوجد خطأ , يرجى اعادة المحاولة");
                }
            }
        });
    }

    private void makeSnackBarMessage(String message) {
        Snackbar.make(mParentLayout, message, Snackbar.LENGTH_SHORT).show();
    }


    @Override
    public void onClick(View view) {
        {


        }
    }
}

4 个答案:

答案 0 :(得分:1)

据我所知,您永远不会从列表(我认为是mNotes或mSearch)中删除该适配器将其用作数据源的元素。 因此,即使从Firebase中删除了它,它也仍然在您的列表中。

答案 1 :(得分:1)

要更新列表,您必须从mNotes中删除具有选定注释位置的注释,然后调用适配器notifyDatasetChanged()。  或者,您必须从数据库调用getNotes()再次加载列表。

答案 2 :(得分:0)

答案1
我明白了,谢谢大家的宝贵时间,解决方案是清除两个同时装载了旧数据和过滤数据的数组列表,然后通知适配器,然后调用get notes()方法从中重新装载新数据。不再包含已删除的Firebase Firestore:-

    @Override
    public void deleteNote(final Note note){
        FirebaseFirestore db = FirebaseFirestore.getInstance();

        DocumentReference noteRef = db
                .collection("notes").document(note.getNote_id());

        noteRef.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if(task.isSuccessful()){
                    makeSnackBarMessage("Deleted fgfff");
                    mNotes.clear();
                    mSearch.clear();
                    mSearchRecyclerViewAdapter.notifyDataSetChanged();
                    getNotes();



                }
                else{
                    makeSnackBarMessage("Failed. Check log.");
                }
            }
        });
    }

答案 3 :(得分:0)

答案2

只要不再次加载数据,我就更喜欢它,因为getnotes()每次用户输入一个字符时都会将数据添加回去。

noteRef.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if(task.isSuccessful()){
                    makeSnackBarMessage("Deleted fgfff");

                    mNotes.remove(note);
                    mSearch.remove(note);
                    mSearchRecyclerViewAdapter.notifyDataSetChanged();



                }
                else{
                    makeSnackBarMessage("Failed. Check log.");
                }
            }
        });
    }