我正在使用 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();
}
}
一旦您删除 Firestore 中的文档,它就会永久消失。 没有取消删除功能。
使用 FirebaseUI 提供的适配器,您想要做的事情可能不太容易。 合理实现撤消功能的唯一方法是让删除功能不实际删除文档,而只是更新 UI 以删除视图。 您必须安排稍后进行删除。 然后,撤消选项将恢复已删除文档的可见性并取消延迟删除。
还可以考虑向文档添加一个新的布尔字段来标记其是否已删除,并在传递给 FirebaseUI 的查询的过滤器中使用该字段。 该字段必须出现在每个文档中才能正确过滤。 UI 完成后,您必须弄清楚如何实际删除您在 UI 中标记为删除的所有文档。
当您删除 firestore 中的文档时,无法恢复它, 但你也许可以创建 2 个集合,当删除某些内容时,仅从第一个集合中删除它,这样你就可以从第二个集合中取回它
也许回答晚了,但我刚刚发现了一些有趣的东西。
如果您使用相同的 id(删除之前的 id)重新添加已删除的项目,您实际上可以恢复它。
此外,如果该项目有任何子集合,它们也将被恢复。
重要提示:我找不到任何声称具有此功能的资源。可能是 bug 或 smt。如果不适合您,请提供反馈。