Skip to main content

How to implement item drag and drop actions in a RecyclerView in Kotlin Android

How to implement item drag and drop actions in a RecyclerView in Kotlin Android.

Here's a step-by-step tutorial on how to implement item drag and drop actions in a RecyclerView in Kotlin Android.

Step 1: Set up your project​

Start by creating a new Kotlin Android project in Android Studio. Make sure you have the necessary dependencies and permissions set up in your project.

Step 2: Add RecyclerView to your layout file​

In your activity layout file (e.g., activity_main.xml), add a RecyclerView element. You can customize its size, layout, and other attributes based on your needs.

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
/>

Step 3: Create a layout file for your RecyclerView items​

Create a new layout file (e.g., item_layout.xml) to define the layout for your RecyclerView items. Customize it with the desired views and design elements.

<!-- item_layout.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:orientation="vertical">

<!-- Add your views here -->

</LinearLayout>

Step 4: Create a ViewHolder class​

Create a ViewHolder class that extends RecyclerView.ViewHolder. This class will hold references to the views in your item layout.

class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
// Add references to your views here
}

Step 5: Create an adapter class​

Create an adapter class that extends RecyclerView.Adapter. This class will handle the data binding and view creation for your RecyclerView.

class ItemAdapter(private val items: List<String>) : RecyclerView.Adapter<ItemViewHolder>() {

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

override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val item = items[position]
// Bind your data to the views here
}

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

Step 6: Set up the RecyclerView in your activity​

In your activity, initialize the RecyclerView and set its adapter.

class MainActivity : AppCompatActivity() {

private lateinit var recyclerView: RecyclerView

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

recyclerView = findViewById(R.id.recyclerView)

val items = listOf("Item 1", "Item 2", "Item 3") // Replace with your own data
val adapter = ItemAdapter(items)

recyclerView.adapter = adapter
}
}

Step 7: Implement drag and drop functionality​

To enable drag and drop actions in your RecyclerView, you need to implement the necessary methods and callbacks.

First, add the necessary dependencies in your app-level build.gradle file:

implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation 'androidx.recyclerview:recyclerview-selection:1.1.0'

Next, update your adapter class to implement the ItemTouchHelperAdapter interface:

class ItemAdapter(private val items: MutableList<String>) : RecyclerView.Adapter<ItemViewHolder>(), ItemTouchHelperAdapter {

// ...

override fun onItemMove(fromPosition: Int, toPosition: Int) {
// Update the dataset and notify the adapter of the move
Collections.swap(items, fromPosition, toPosition)
notifyItemMoved(fromPosition, toPosition)
}

override fun onItemDismiss(position: Int) {
// Remove the item from the dataset and notify the adapter
items.removeAt(position)
notifyItemRemoved(position)
}
}

Next, create a helper class that extends ItemTouchHelper.Callback:

class ItemTouchHelperCallback(private val adapter: ItemTouchHelperAdapter) : ItemTouchHelper.Callback() {

override fun isLongPressDragEnabled(): Boolean {
return true
}

override fun isItemViewSwipeEnabled(): Boolean {
return true
}

override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
val swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
return makeMovementFlags(dragFlags, swipeFlags)
}

override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
adapter.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
return true
}

override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
adapter.onItemDismiss(viewHolder.adapterPosition)
}
}

Finally, in your activity's onCreate method, create an instance of ItemTouchHelper and attach it to the RecyclerView:

class MainActivity : AppCompatActivity() {

// ...

override fun onCreate(savedInstanceState: Bundle?) {
// ...

val itemTouchHelperCallback = ItemTouchHelperCallback(adapter)
val itemTouchHelper = ItemTouchHelper(itemTouchHelperCallback)
itemTouchHelper.attachToRecyclerView(recyclerView)
}
}

That's it! You have now implemented item drag and drop actions in your RecyclerView using Kotlin in Android. You can customize the behavior and appearance further based on your requirements.