After removing the item from the Realtime Database and RecyclerView, I wish to add an UNDO function to recover the deleted item just now. May I know how to achieve it?
Below is my source code in Adapter class:
public Adapter(@NonNull FirebaseRecyclerOptions options) { super(options); }
@NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate (R.layout.retrieved_layout,parent,false); return new MyViewHolder(view); } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNull Model model) { holder.name.setText(model.getTask()); holder.date.setText(model.getDate()); } public static class MyViewHolder extends RecyclerView.ViewHolder { TextView name = itemView.findViewById(R.id.taskTv); TextView date = itemView.findViewById(R.id.dateTv); public MyViewHolder(@NonNull View itemView) { super(itemView); } }
And here is my MainActivity:
recyclerView = findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
loader = new ProgressDialog(this);
mAuth = FirebaseAuth.getInstance();
onlineUserID = mAuth.getCurrentUser().getUid();
reference = FirebaseDatabase.getInstance().getReference().child("task").child(onlineUserID);
add = findViewById(R.id.add);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addTask();
}
});
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
// add task to recycler view
FirebaseRecyclerOptions<Model> options = new FirebaseRecyclerOptions.Builder<Model>()
.setQuery(reference, Model.class)
.build();
adapter = new Adapter(options);
}
// add task to real time database
private void addTask() {
AlertDialog.Builder myDialog = new AlertDialog.Builder(this);
LayoutInflater inflater = LayoutInflater.from(this);
View view = inflater.inflate(R.layout.input, null);
myDialog.setView(view);
AlertDialog dialog = myDialog.create();
final EditText task = view.findViewById(R.id.taskName);
ImageView upload = view.findViewById(R.id.upload);
upload.setOnClickListener((v) -> {
String mTask = task.getText().toString().trim();
String id = reference.push().getKey();
String date = DateFormat.getDateInstance().format(new Date());
if(TextUtils.isEmpty(mTask)){
task.setError("Task name required");
return;
}
else {
loader.setMessage("Adding your data");
loader.setCanceledOnTouchOutside(false);
loader.show();
Model model = new Model(mTask,id,date);
reference.child(id).setValue(model).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()) {
Toast.makeText(MainActivity.this, "Task added successfully !", Toast.LENGTH_SHORT).show();
loader.dismiss();
}
}
});
}
dialog.dismiss();
});
dialog.show();
}
// add task to recycler view
@Override
protected void onStart() {
super.onStart();
recyclerView.setAdapter(adapter);
adapter.startListening();
}
// swipe to delete task
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
if (direction == ItemTouchHelper.LEFT) {
reference.child(key).removeValue();
Snackbar.make(recyclerView,"Task deleted", Snackbar.LENGTH_SHORT)
.setAction("Undo", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
})
.show();
}
}