У меня есть просмотрщик с 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
? Или мне нужно реализовать этот другой путь?