Skip to main content

How to implement swipe to dismiss functionality in a RecyclerView in Kotlin Android

How to implement swipe to dismiss functionality in a RecyclerView in Kotlin Android.

Here's a step-by-step tutorial on how to implement swipe to dismiss functionality in a RecyclerView in Kotlin Android:

Step 1: Set up your project

  • Create a new Android project in Kotlin.
  • Add the necessary dependencies in your app-level build.gradle file:
dependencies {
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.cardview:cardview:1.0.0'
}

Step 2: Create RecyclerView layout

  • Open your activity_main.xml layout file.
  • Add a RecyclerView element inside a parent layout:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />

Step 3: Create RecyclerView item layout

  • Create a new XML layout file named item_list.xml.
  • Design the layout for your RecyclerView items. For example:
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp">

<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp" />

</androidx.cardview.widget.CardView>

Step 4: Create RecyclerView Adapter

  • Create a new Kotlin class named RecyclerViewAdapter.
  • Extend RecyclerView.Adapter and implement the necessary methods.
  • Use the ViewHolder pattern to optimize performance:
class RecyclerViewAdapter(private val items: List<String>) :
RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_list, parent, false)
return ViewHolder(view)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = items[position]
holder.textView.text = item
}

override fun getItemCount(): Int {
return items.size
}

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView.findViewById(R.id.textView)
}
}

Step 5: Implement swipe to dismiss functionality

  • Inside your MainActivity, initialize the RecyclerView and set its adapter:
class MainActivity : AppCompatActivity() {

private lateinit var recyclerView: RecyclerView
private lateinit var adapter: RecyclerViewAdapter

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

recyclerView = findViewById(R.id.recyclerView)
adapter = RecyclerViewAdapter(getItems())
recyclerView.adapter = adapter

val itemTouchHelper = ItemTouchHelper(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
adapter.removeItem(position)
}
})
itemTouchHelper.attachToRecyclerView(recyclerView)
}

private fun getItems(): List<String> {
return listOf("Item 1", "Item 2", "Item 3", "Item 4", "Item 5")
}
}

Step 6: Handle swipe gestures

  • In the above code, we use ItemTouchHelper to handle swipe gestures.
  • We specify the directions in which the items can be swiped (e.g., left or right).
  • In the onSwiped method, we remove the swiped item from the adapter by calling removeItem(position) method.

Step 7: Add removeItem method to RecyclerViewAdapter

  • Inside the RecyclerViewAdapter class, add a removeItem method to remove an item from the list and notify the adapter:
fun removeItem(position: Int) {
items.toMutableList().removeAt(position)
notifyItemRemoved(position)
}

That's it! You have successfully implemented swipe to dismiss functionality in a RecyclerView using Kotlin Android. Now, when you swipe an item left or right, it will be removed from the list.