Перетаскивание между двумя утилитами просмотра с переупорядочением - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь реализовать перетаскивание между двумя 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...