![](/img/trans.png)
[英]Adding values from Firebase to RecycleView adapter won't show in app
[英]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()
将被一次又一次地调用,并且您的列表将被更新。
好方法
addListenerForSingleValueEvent
。removeValue();
在参考。null
如果它为 null 我们现在可以更新我们的recyclerview
。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.