Я не знаю, как восстановить удаленный документ в Firestore с помощью SnackBar Undo - PullRequest
0 голосов
/ 05 августа 2020

Я создаю приложение Task с помощью 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();
    }
}

1 Ответ

0 голосов
/ 05 августа 2020

Как только вы удалите документ в Firestore, он исчезнет навсегда. Здесь нет функции восстановления.

То, что вы пытаетесь сделать, вероятно, не очень просто с адаптером, предоставленным FirebaseUI. Единственный способ разумно реализовать функцию отмены - это сделать так, чтобы функция удаления фактически не удаляла документ, а вместо этого просто обновляла пользовательский интерфейс, чтобы удалить представление. Вам придется запланировать удаление на некоторое время позже. Опция отмены затем просто восстановит видимость удаленного документа и отменит отложенное удаление.

Также рассмотрите возможность простого добавления нового логического поля в документ, чтобы отметить, что он удален или нет, и использовать это в фильтре для запроса, который вы передаете FirebaseUI. Поле должно присутствовать в каждом документе для правильной фильтрации. После того, как пользовательский интерфейс будет готов, вам нужно будет выяснить, как на самом деле удалить все документы, которые вы отметили для удаления в пользовательском интерфейсе.

...