1 year ago

#371883

test-img

Seb

Drag and Drop to reorder and move from one to another recycling view

I am building an app to be able to drag an item from one recycle view to another and I still have to keep the option to re-order inside a single recycler view.

So I have defined a Reorder Callback already

class ReorderHelperCallback(val adapter : ItemTouchHelperAdapter): ItemTouchHelper.Callback() {

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

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

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        //Not use for Drag N Drop
    }

}

also an interface:

interface OnStartDragListener {
    fun onStartDrag(viewHolder: RecyclerView.ViewHolder?)
}

and a touchhelper:

interface ItemTouchHelperAdapter {
    fun onItemMove(fromPosition: Int, toPosition: Int): Boolean
    fun onItemDismiss(position: Int)
}

to allow the reorder to work, I had to update the Recycler view adapter as below:


class Adapter(
    private var context: Context?,
    val dragStartListener : OnStartDragListener
): RecyclerView.Adapter<Adapter.ViewHolder>(), ItemTouchHelperAdapter {

    var arrayItems : ArrayList<Data?> = ArrayList()

    fun setData(array : MutableList<Data?>){
        array.toCollection(arrayItems)
        notifyDataSetChanged()
    }

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

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Adapter.ViewHolder {
        val binding = DashboardTileLayoutBinding
            .inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding, dragStartListener)
    }

    override fun onBindViewHolder(holder: Adapter.ViewHolder, position: Int) {
        holder.setData(arrayItems[position])
    }

    inner class ViewHolder(val binding: LayoutBinding,
                           val dragStartListener : OnStartDragListener? = null)
        : RecyclerView.ViewHolder(binding.root) {

        val tileLayout = binding.tileLayout

        fun setData(data: Data?) {

           ....
            tileLayout.setOnDragListener { view, dragEvent ->
                when(dragEvent.action) {
                    ACTION_DRAG_STARTED -> {
                        dragStartListener?.onStartDrag(this)
                        true
                    }
                    else -> false
                }
            }
        }
    }

    override fun onItemMove(fromPosition: Int, toPosition: Int): Boolean {
        Collections.swap(arrayItems, fromPosition, toPosition)
        notifyItemMoved(fromPosition, toPosition)
        return true
    }

    override fun onItemDismiss(position: Int) {
        TODO("Not yet implemented")
    }


}

and the fragment which contain the rv, I have updated the adapter init:

list1adapter?.let { adapter ->
                adapter.setData(list)
                val callback: ItemTouchHelper.Callback = ReorderHelperCallback(adapter)
                mItemTouchHelperSelected = ItemTouchHelper(callback)
                mItemTouchHelperSelected?.attachToRecyclerView(selectedLayout)
            }
---


override fun onStartDrag(viewHolder: RecyclerView.ViewHolder?) {
        viewHolder?.let {
            mItemTouchHelperSelected?.startDrag(it)
        }
    }

But my fragment contain 2 recycler views. list1 is working fine to user drag and drop to re-order the item but now, I would like to also be able to move an item from my rv list1 to the list2 and vice versa

Any idea, how to make it Kotlin ? I tried an sample code, byt I am losing the re-ordering.

Thanks

android

kotlin

android-recyclerview

drag-and-drop

0 Answers

Your Answer

Accepted video resources