package com.example.swipetodismiss
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar
class SwipeToDismissList : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private lateinit var adapter: ItemAdapter
private val items = mutableListOf("Item 1", "Item 2", "Item 3", "Item 4", "Item 5")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_swipe_to_dismiss_list)
recyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
adapter = ItemAdapter(items)
recyclerView.adapter = adapter
val itemTouchHelperCallback = object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
val position = viewHolder.adapterPosition
val removedItem = items[position]
items.removeAt(position)
adapter.notifyItemRemoved(position)
Snackbar.make(recyclerView, "$removedItem removed", Snackbar.LENGTH_LONG)
.setAction("Undo") {
items.add(position, removedItem)
adapter.notifyItemInserted(position)
}.show()
}
}
val itemTouchHelper = ItemTouchHelper(itemTouchHelperCallback)
itemTouchHelper.attachToRecyclerView(recyclerView)
}
}
// Adapter class for RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class ItemAdapter(private val items: List<String>) : RecyclerView.Adapter<ItemAdapter.ViewHolder>() {
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView.findViewById(android.R.id.text1)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(android.R.layout.simple_list_item_1, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.textView.text = items[position]
}
override fun getItemCount(): Int = items.size
}This solution uses ItemTouchHelper.SimpleCallback to detect swipe gestures on the RecyclerView items. When the user swipes left or right, the onSwiped method is called.
Inside onSwiped, the item is removed from the list and the adapter is notified to update the UI. Then a Snackbar appears with an Undo button.
If the user taps Undo, the removed item is added back to the list at the same position and the adapter updates the UI again.
This approach gives a smooth swipe-to-dismiss experience with a chance to undo accidental removals.