Skip to content

Instantly share code, notes, and snippets.

@Jatra
Created April 29, 2018 15:37
Show Gist options
  • Save Jatra/25f299e1263b7f48a02c8f2f4aed8349 to your computer and use it in GitHub Desktop.
Save Jatra/25f299e1263b7f48a02c8f2f4aed8349 to your computer and use it in GitHub Desktop.
Kotlin drag to reorder recyclerview
package uk.co.jatra.recorder
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.helper.ItemTouchHelper
import android.support.v7.widget.helper.ItemTouchHelper.DOWN
import android.support.v7.widget.helper.ItemTouchHelper.UP
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import kotlinx.android.synthetic.main.edit_form.*
import java.util.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.edit_form)
val myAdapter = MyAdapter(getData())
recyclerView.adapter = myAdapter
recyclerView.layoutManager = LinearLayoutManager(this)
val touchHelper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(UP + DOWN, 0) {
override fun onMove(recyclerView: RecyclerView?, viewHolder: RecyclerView.ViewHolder?, target: RecyclerView.ViewHolder?): Boolean {
myAdapter.onItemMove(viewHolder?.adapterPosition, target?.adapterPosition);
return true
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder?, direction: Int) {
}
override fun isLongPressDragEnabled(): Boolean {
return true
}
})
touchHelper.attachToRecyclerView(recyclerView)
}
}
class MyAdapter(val data: List<String>) : RecyclerView.Adapter<MyViewHolder>() {
override fun getItemCount() = data.size
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
(holder.itemView as TextView).text = data[position]
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = LayoutInflater.from(parent.context).inflate(android.R.layout.simple_list_item_1, parent, false)
return MyViewHolder(view)
}
fun onItemMove(fromPosition: Int?, toPosition: Int?): Boolean {
fromPosition?.let {
toPosition?.let {
if (fromPosition < toPosition) {
for (i in fromPosition until toPosition) {
Collections.swap(data, i, i + 1)
}
} else {
for (i in fromPosition downTo toPosition + 1) {
Collections.swap(data, i, i - 1)
}
}
notifyItemMoved(fromPosition, toPosition)
return true
}
}
return false
}
}
class MyViewHolder(view: View) : RecyclerView.ViewHolder(view)
private fun getData(): List<String> {
return listOf(
"one",
"two",
"three",
"four",
"five",
"six",
"1one",
"1two",
"1three",
"1four",
"1five",
"1six",
"2one",
"2two",
"2three",
"2four",
"2five",
"2six",
"3one",
"3two",
"3three",
"3four",
"3five",
"3six",
"seven"
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment