0
0
Android Kotlinmobile~20 mins

Swipe to dismiss in Android Kotlin - Mini App: Build & Ship

Choose your learning style9 modes available
Build: SwipeToDismissList
A screen that shows a list of items. You can swipe an item left or right to remove it from the list.
Target UI
Swipe to dismiss list:
-----------------------
| Item 1             |
| Item 2             |
| Item 3             |
| Item 4             |
| Item 5             |
-----------------------
Display a vertical list of text items
Allow user to swipe left or right on an item to remove it
Show a Snackbar with Undo option after dismissal
Undo restores the removed item to the list
Starter Code
Android Kotlin
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

        // TODO: Add swipe to dismiss functionality here
    }
}
Task 1
Task 2
Task 3
Task 4
Solution
Android Kotlin
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.

Final Result
Completed Screen
Swipe to dismiss list:
-----------------------
| Item 1             |
| Item 2             |
| Item 3             |
| Item 4             |
| Item 5             |
-----------------------

User swipes Item 3 to the left:
-----------------------
| Item 1             |
| Item 2             |
| Item 4             |
| Item 5             |
-----------------------
[Snackbar: "Item 3 removed" Undo]
Swipe an item left or right to remove it from the list
Snackbar appears at bottom with Undo button
Tap Undo to restore the removed item in the same position
Stretch Goal
Add a confirmation dialog before removing the item after swipe
💡 Hint
Use AlertDialog in onSwiped to ask user to confirm removal before deleting the item