【问题标题】:I don't know how to restore a deleted document on Firestore using SnackBar Undo我不知道如何使用 SnackBar Undo 恢复 Firestore 上已删除的文档
【发布时间】:2020-11-25 23:55:48
【问题描述】:

我正在使用 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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      在 Firestore 中删除文档后,它就永远消失了。没有取消删除功能。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-29
        • 1970-01-01
        • 2010-12-23
        • 2013-12-21
        • 2020-01-04
        • 1970-01-01
        相关资源
        最近更新 更多