Я пытаюсь реализовать перетаскивание между двумя RecyclerView с переупорядочением элементов.Пока я почти выполнил эту задачу, но получил одну сложную вещь: когда я перемещаю один вид поверх другого, он перемещается от источника к цели и цели к источнику несколько раз.Я думаю, что мне нужно дождаться окончания анимации или другого решения - я не знаю, как это сделать.
Вот код View.OnDragListener в kotlin.OnDragListener применяется как к RecyclerView
inner class DragListener : View.OnDragListener {
private var draggedWord: String? = null
private var draggedPosition = -1
override fun onDrag(v: View, event: DragEvent): Boolean {
val draggedView = event.localState as View? ?: return true
val target = v as RecyclerView
val targetAdapter = if (target.id == R.id.workWordsArea) workAdapter else inputAdapter
when (event.action) {
DragEvent.ACTION_DRAG_ENTERED -> {
if (draggedWord != null) {
return true
}
val layoutManager = target.layoutManager as GridLayoutManager
if (draggedView is TextView) {
val position = layoutManager.getPosition(draggedView)
draggedPosition = position
draggedWord = targetAdapter[position]
targetAdapter.setDummy(position)
targetAdapter.notifyItemChanged(position)
}
}
DragEvent.ACTION_DRAG_EXITED -> {
if (draggedPosition == -1) return true
targetAdapter.remove(draggedPosition)
targetAdapter.notifyItemRemoved(draggedPosition)
targetAdapter.notifyItemRangeChanged(draggedPosition, targetAdapter.size - draggedPosition)
draggedPosition = -1
}
DragEvent.ACTION_DRAG_LOCATION -> {
// drop to end always
if (target.id == R.id.inputWordsArea) {
return true
}
val layoutManager = target.layoutManager as GridLayoutManager
val targetView = target.findChildViewUnder(event.x, event.y)
if (targetView != null && targetView is TextView) {
val targetPosition = layoutManager.getPosition(targetView)
if (targetAdapter[targetPosition] == "d") {
return false
}
if (draggedPosition == -1) {
targetAdapter.insertDummy(targetPosition)
targetAdapter.notifyItemInserted(targetPosition)
draggedPosition = targetPosition
} else {
if (targetPosition != draggedPosition) {
targetAdapter.moveDummy(draggedPosition, targetPosition)
targetAdapter.notifyItemMoved(draggedPosition, targetPosition)
draggedPosition = targetPosition
}
}
}
}
DragEvent.ACTION_DROP -> {
// drop to end
if (draggedPosition == -1) {
targetAdapter.add(draggedWord!!)
targetAdapter.notifyItemInserted(targetAdapter.size - 1)
} else {
targetAdapter.set(draggedPosition, draggedWord!!)
targetAdapter.notifyItemChanged(draggedPosition)
}
// reset dragged vars
draggedWord = null
draggedPosition = -1
}
}
return true
}
}