Drag and drop inside and outside of RecyclerView

22 Views Asked by At

How to implement the ability to reorder items of RecyclerView with drad&drop feature and delete an item by dragging it onto the certain view outside of RecyclerView?

I've tried to combine ItemTouchHelper and setOnLongClickListener with startDragAndDrop() inside. They work well separately, but when combined, only setOnLongClickListener works.

ItemTouchHelper implementation in fragment:

val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(
            ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.START or ItemTouchHelper.END,
            0
        ) {
            override fun onMove(
                recyclerView: RecyclerView,
                source: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean {
                val sourcePosition = source.adapterPosition
                val targetPosition = target.adapterPosition

                viewModel.swapPlayers(sourcePosition, targetPosition)
                adapter.notifyItemMoved(sourcePosition, targetPosition)

                return true
            }

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

        })

setOnLongClickListener implemetation in onBindViewHolder of an adapter:

holder.itemView.setOnLongClickListener {
            val item = ClipData.Item(player.id.toString())
            val mimeTypes = listOf(ClipDescription.MIMETYPE_TEXT_PLAIN)
            val dragData = ClipData(player.id.toString(), mimeTypes.toTypedArray(), item)
            val myShadow = DragShadowBuilder(it)
            it.startDragAndDrop(dragData, myShadow, null, 0)
            return@setOnLongClickListener true
        }
0

There are 0 best solutions below