Java FirebaseUI FirestoreRecyclerAdapter-获取文档引用以删除它
从Java FirebaseUI FirestoreRecyclerAdapter-获取文档引用以删除它,java,android,firebase,google-cloud-firestore,firebaseui,Java,Android,Firebase,Google Cloud Firestore,Firebaseui,从Firestore的Firebase UIRecyclerView中删除项目的正确方法是什么 这是我的方法: new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { @Override public boolean onMove(RecyclerView recyclerView, R
Firestore
的Firebase UI
RecyclerView中删除项目的正确方法是什么
这是我的方法:
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
deleteItem(viewHolder.getAdapterPosition());
}
}).attachToRecyclerView(recyclerView);
private void deleteItem(int position) {
DocumentSnapshot ds = (DocumentSnapshot) adapter.getSnapshots().getSnapshot(position);
DocumentReference document = ds.getReference();
document.delete();
}
为什么getSnapshot
返回的是对象而不是文档snapshot
?对(DocumentSnapshot)
的转换是否正确
另外,由于适配器已对数据库中的更改做出反应,因此我不必调用notifyDataSetChanged
或notifyItemRemoved
,这是否正确?根据您的评论,如果要从数据库中删除某个项目,则应使用delete()
方法直接在文档引用
对象上
db.collection("YourCollection").document("DocumentToDelete")
.delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "DocumentSnapshot successfully deleted!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Error deleting document", e);
}
});
还请注意,删除文档不会删除其子集合(如果有的话)。正确的方法是创建Firebase UI适配器,如下所示:
public class YourFirestoreAdapter extends
FirestoreRecyclerAdapter<YourClass, RecyclerView.ViewHolder> {
//complete the method here for the Adapter, like you would a normal Recycle adapter.
然后,通过从ItemTouchHelper传递位置,无论何时要删除项目,都可以从活动中调用此方法
new ItemTouchHelper(new
ItemTouchHelper.SimpleCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder
viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
adapter.deleteItem(viewHolder.getAdapterPosition());
}
}).attachToRecyclerView(recyclerView);
您想从数据库中完全删除该项目还是仅从适配器中删除?我也想从Firestore数据库中删除它谢谢,但我想从适配器中删除DocumentReference。我不明白您的意思。从数据库中删除文档后,适配器也会删除文档,对吗?我遗漏了什么吗?FirebaseUI适配器将查询作为输入,这意味着我事先没有对任何文档的引用。我想从适配器位置获取对单击项的引用,这显然是由adapter.getSnapshots().getSnapshot(位置)
Yes完成的,这是正确的。adapter.getSnapshots().getSnapshot(position)
返回什么?一切正常吗?问题解决了吗?
public void deleteItem(int position) {
getSnapshots().getSnapshot(position).getReference().delete();
}
new ItemTouchHelper(new
ItemTouchHelper.SimpleCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder
viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
adapter.deleteItem(viewHolder.getAdapterPosition());
}
}).attachToRecyclerView(recyclerView);