簡體   English   中英

從 firebase 中刪除值時更新 Recycleview 適配器

[英]Update the Recycleview adapter when a value is deleted from firebase

我使用了帶有數據列表和按鈕的 cardivew 的 Recycleview 來刪除任何值。 當我單擊按鈕時,它確實從 firebase 數據庫中刪除了值,但文本和行仍然保留在應用程序的適配器中,但只有當我通過返回並重新打開來關閉活動時,行才為空。

當我點擊刪除按鈕時,如何立即更新回收視圖

這是我的代碼

 public class SubjectBooksAdapter extends RecyclerView.Adapter<SubjectBooksAdapter.MyViewHolder> { ArrayList<Books> bookslist; FirebaseDatabase database; DatabaseReference dbreference; public SubjectBooksAdapter(ArrayList<Books> bookslist){ this.bookslist = bookslist; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout,parent,false); return new MyViewHolder(v); } public class MyViewHolder extends RecyclerView.ViewHolder { Button mSolved; MyViewHolder(final View itemView) { super(itemView); database = FirebaseDatabase.getInstance(); dbreference = database.getReference("roomrequest"); dbreference.keepSynced(true); mSolved = (Button) itemView.findViewById(R.id.book_solved); mSolved.setTransformationMethod(null); fauth = FirebaseAuth.getInstance(); } } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { database = FirebaseDatabase.getInstance(); dbreference = database.getReference("roomrequest"); holder.mSolved.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference classicalMechanicsRef = rootRef.child("roomrequest").child("request").child(g.getRequestid()); ValueEventListener valueEventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { dataSnapshot.getRef().removeValue(); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }; classicalMechanicsRef.addListenerForSingleValueEvent(valueEventListener); } }); } @Override public int getItemCount() { return bookslist.size(); } }

任何幫助表示贊賞

classicalMechanicsRef.addListenerForSingleValueEvent(valueEventListener);

Firebase 為事件提供了 3 種類型的偵聽器。這里您使用的是單值事件的偵聽器。 如果您只想讀取一次值,請使用ref.addListenerForSingleValueEvent()

這里您想要的是來自 firebase 的更新列表,您需要做的是再次從 firebase 獲取列表並將其傳遞給適配器。 但由於它是 firebase 事件,它顯然會從 firebase 數據庫中刪除數據,因此您可以從 recyclerview 中刪除該元素。

壞方法

如果多個用戶沒有更新同一個列表,那么您可以使用ValueEventListener

 reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
       // set recyclverview from data
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
       // error handling
    }
});

這種方法很糟糕,因為如果任何其他用戶對數據進行了更改,那么您的onDataChange()將被一次又一次地調用,並且您的列表將被更新。

好方法

  1. 注冊一個addListenerForSingleValueEvent
  2. 將所有項目傳遞給回收站適配器。
  3. 如果項目被刪除,則調用removeValue(); 在參考。
  4. 再次調用 firebase 來檢查是否刪除了 key 為null如果它為 null 我們現在可以更新我們的recyclerview
  5. 使用以下方法從RecyclerView刪除項目。

首先,項目應該從列表中刪除!

mDataSet.remove(getAdapterPosition());

然后:

notifyItemRemoved(getAdapterPosition());
notifyItemRangeChanged(getAdapterPosition(),mDataSet.size());

假設你有一個包含你的書的節點的 firebase 引用,比如“booksRef”,你有一個書的模型類,比如“Book.java”,每本書都有一個唯一的 ID,比如“bookID”。 在您的模型類中,您有一個書籍 ID 獲取器說“getBookID”,現在將一個 firebase onChildEventListener() 添加到您的 booksRef 中,如下所示:

    booksRef.addChildEventListener(new ChildEventListener ()  {

        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Book addedBook = dataSnapshot.getValue(Book.class);

            bookslist.add(addedBook);
            adapter.notifyItemInserted(bookslist.size());
        }


        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            Book changedBook = dataSnapshot.getValue(Book.class);

            for (int i = 0; i < bookslist.size(); i++) {
                if (bookslist.get(i).getBookID().equals(changedBook.getBookID())) {
                    bookslist.set(i, changedBook);
                    adapter.notifyItemChanged(i);
                    break;
                }
            }
        }


        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            Book removedBook = dataSnapshot.getValue(Book.class);

            for (int i = 0; i < bookslist.size(); i++) {
                if (bookslist.get(i).getBookID().equals(removedBook.getBookID())) {
                    bookslist.remove(i);
                    adapter.notifyItemRemoved(i);
                    break;
                }
            }

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

這將在成功添加、編輯和刪除 firebase childNode 后立即更新 recycleview。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM