从Firebase中删除值后,请更新Recycleview适配器

时间:2019-01-12 08:03:33

标签: java android firebase firebase-realtime-database

我使用了带有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();
    }
}

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

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来检查是否删除的密钥为null,如果它为null,我们现在可以更新recyclerview
  5. 使用以下方法从RecyclerView中删除项目。

首先,应从列表中删除项目!

mDataSet.remove(getAdapterPosition());

然后:

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

答案 1 :(得分:0)

假设您对包含书的节点有一个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。