Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FirebaseUI FirestoreRecyclerAdapter-获取文档引用以删除它_Java_Android_Firebase_Google Cloud Firestore_Firebaseui - Fatal编程技术网

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);