RecyclerView переместить элементы и вызвать notifyDataSetChanged, когда закончите - PullRequest
0 голосов
/ 13 октября 2019

У меня есть просмотрщик с ItemTouchHelper для перемещения предметов. Код довольно прост:

itemTouchHelper = ItemTouchHelper(
        object : ItemTouchHelper.SimpleCallback(UP or DOWN, 0) {
            override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean {
                val rAdapter = recyclerView.adapter as ExercisesInRoutineAdapter
                val from = viewHolder.adapterPosition
                val to = target.adapterPosition

                rAdapter.moveItem(from, to)
                rAdapter.notifyItemMoved(from, to)
                return true
            }

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

        })
    itemTouchHelper.attachToRecyclerView(recyclerView)

У меня есть ViewView внутри ViewHolder, который используется как Draghandler:

private lateinit var dragHandler: ImageView
dragHandler = view.findViewById(R.id.image_view_drag_view_dropset
dragHandler.setOnTouchListener { _, event ->
            if (event.actionMasked == MotionEvent.ACTION_DOWN) {
                if (listener != null)
                    listener!!.startDragging(this)
            }
            return@setOnTouchListener true
        }

Слушателем является действие со следующим методом переопределения:

override fun startDragging(viewHolder: RecyclerView.ViewHolder) {
    itemTouchHelper.startDrag(viewHolder)
}

метод moveItem(from: Int, to:Int) просто перемещает элементы путем изменения позиций.

Это работает. Но теперь я хочу вызвать notifyDataSetChanged(), когда перетаскивание закончено, потому что, изменяя позиции элементов, ViewHolders также имеет изменение, и я хочу, чтобы это изменение произошло. Я попробовал следующее:

dragHandler.setOnTouchListener { _, event ->
            if (event.actionMasked == MotionEvent.ACTION_DOWN) {
                if (listener != null)
                    listener!!.startDragging(this)
            } else if(event.actionMasked == MotionEvent.ACTION_UP) {
                notifyDataSetChanged()
            }
            return@setOnTouchListener true
        }

Это работает, только если элемент не перетаскивается, а просто щелкается и отпускается. Мне нужен еще один констант MotionEvent? Или мне нужно реализовать этот другой путь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...