Итак, я пытаюсь понять это. Я вижу много сообщений в Интернете о том, что элементы RecyclerView можно использовать как смахиванием, так и перетаскиванием - я это понял. Но то, что я не могу заставить работать, - это действия перетаскивания и длительного нажатия.
У меня есть рабочий код для перетаскивания и длительного щелчка, проблема в том, что когда я долго щелкаю элемент ресайклера, это бросает вверх независимо от того, будет ли он запускать функцию longclick или функцию перетаскивания.
Вот код для прослушивателя длительного нажатия:
holder.itemView.setOnLongClickListener {
currentNote.toggleSelection(it)
// change the MainActivity menu to the selection menu
MainActivity.currentMenu = R.menu.menu_select
(it.context as Activity).invalidateOptionsMenu()
// set a flag to change the onClickListener to select notes rather than edit/view
SELECTING = true
notifyDataSetChanged()
true
Достаточно просто. И вот как я реализовал действие перетаскивания:
val itemTouchHelper = ItemTouchHelper(object : ItemTouchHelper.Callback() {
override fun isLongPressDragEnabled() = true
override fun isItemViewSwipeEnabled() = true
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
val dragFlags = UP or DOWN or START or END
val swipeFlags = LEFT or RIGHT
return makeMovementFlags(dragFlags, swipeFlags)
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
val fromPosition = viewHolder.adapterPosition
val toPosition = target.adapterPosition
val item = NOTES_ARRAY.removeAt(fromPosition)
NOTES_ARRAY.add(toPosition, item)
recyclerView.adapter!!.notifyItemMoved(fromPosition, toPosition)
return true
}
})
Это приложение для создания заметок, поэтому я использую действие длительного нажатия для выполнения множественного выбора. Итак, вопрос в том, как я могу различить действие длительного нажатия и действие перетаскивания, поскольку они оба связаны с «долгим нажатием».
Я знаю, что это проблема, потому что если я закомментирую onLongClickListener, я могу легко перетащить его без проблем.