我不知道如何使用 SnackBar Undo 恢复 Firestore 上已删除的文档

问题描述 投票:0回答:3

我正在使用 FirestoreRecycler 创建一个任务应用程序。我已经创建了从 RecyclerView 中删除项目的方法,但我不知道如何在 Snackbar 中撤消此操作。

我有一个 Note 类和一个 FirestoreRecycler 都设置我的 Note 和 RecyclerView 功能。

这是我第一次使用 FirestoreUI。


import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;

import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;

public class MainActivity extends AppCompatActivity {
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference notebookRef = db.collection("Notebook");

    RecyclerView recyclerView;
    private NoteAdapter adapter;
    CoordinatorLayout coordinatorLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView        = findViewById(R.id.recycler_view);
        coordinatorLayout   = findViewById(R.id.coordinator);
        setUpRecyclerView();
        enableSwipeToDeleteAndUndo();

        FloatingActionButton buttonAddNote = findViewById(R.id.button_add_note);
        buttonAddNote.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, NewNoteActivity.class));
            }
        });

    }

    public void setUpRecyclerView(){
        Query query = notebookRef.orderBy("priority", Query.Direction.DESCENDING);
        FirestoreRecyclerOptions<Note> options = new FirestoreRecyclerOptions.Builder<Note>().setQuery(query, Note.class).build();
        adapter = new NoteAdapter(options);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);

    }

    public void enableSwipeToDeleteAndUndo(){
        SwipeToDeleteCallback swipeToDeleteCallback = new SwipeToDeleteCallback(this) {
            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

                final int position  = viewHolder.getAdapterPosition();
                final String item   = adapter.getItem(position).toString();
                boolean clicked = false;

                adapter.deleteItem(viewHolder.getAdapterPosition());

                Snackbar snackbar = Snackbar.make(coordinatorLayout, "Nota foi removida da lista " , Snackbar.LENGTH_LONG);
                snackbar.setAction("DESFAZER", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        adapter.restoreItem(item, position);
                        recyclerView.scrollToPosition(position);
                    }
                });
                snackbar.setActionTextColor(Color.YELLOW);
                snackbar.show();
            }
        };

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(swipeToDeleteCallback);
        itemTouchHelper.attachToRecyclerView(recyclerView);
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}
android firebase android-recyclerview google-cloud-firestore android-snackbar
3个回答
2
投票

一旦您删除 Firestore 中的文档,它就会永久消失。 没有取消删除功能。

使用 FirebaseUI 提供的适配器,您想要做的事情可能不太容易。 合理实现撤消功能的唯一方法是让删除功能不实际删除文档,而只是更新 UI 以删除视图。 您必须安排稍后进行删除。 然后,撤消选项将恢复已删除文档的可见性并取消延迟删除。

还可以考虑向文档添加一个新的布尔字段来标记其是否已删除,并在传递给 FirebaseUI 的查询的过滤器中使用该字段。 该字段必须出现在每个文档中才能正确过滤。 UI 完成后,您必须弄清楚如何实际删除您在 UI 中标记为删除的所有文档。


1
投票

当您删除 firestore 中的文档时,无法恢复它, 但你也许可以创建 2 个集合,当删除某些内容时,仅从第一个集合中删除它,这样你就可以从第二个集合中取回它


0
投票

也许回答晚了,但我刚刚发现了一些有趣的东西。

如果您使用相同的 id(删除之前的 id)重新添加已删除的项目,您实际上可以恢复它。

此外,如果该项目有任何子集合,它们也将被恢复。

重要提示:我找不到任何声称具有此功能的资源。可能是 bug 或 smt。如果不适合您,请提供反馈。

© www.soinside.com 2019 - 2024. All rights reserved.