Android: элемент RecyclerView с LongClickListener и перетаскиванием - PullRequest
1 голос
/ 02 августа 2020

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

...