Artyum
Artyum

Reputation: 179

RecyclerView on drop

I have RecyclerView Drag & Drop feature, but I'd like to do some calculations onDrop. When I put my expensiveFunction() in onMove() it's triggered at every position change until the drag is over. That's a big overkill. Is there a way to trigger function on drag end?

val itemTouchHelper = ItemTouchHelper(simpleCallback)
itemTouchHelper.attachToRecyclerView(recyclerView)

private var simpleCallback = object : ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP.or(ItemTouchHelper.DOWN), 0) {
    override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
        val startPosition = viewHolder.absoluteAdapterPosition
        val endPosition = target.absoluteAdapterPosition

        Collections.swap(itemList, startPosition, endPosition)
        recyclerView.adapter?.notifyItemMoved(startPosition, endPosition)

        expensiveFunction()

        return true
    }
}

Upvotes: 2

Views: 612

Answers (1)

Zain
Zain

Reputation: 40878

You could override onSelectedChanged() which get called when the ViewHolder swiped or dragged by the ItemTouchHelper.

To catch the drop action examine the actionState value to be ItemTouchHelper.ACTION_STATE_IDLE:

override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
    super.onSelectedChanged(viewHolder, actionState)
    when (actionState) {
        // when the item is dropped
        ItemTouchHelper.ACTION_STATE_IDLE -> {
            Log.d(TAG, "Item is dropped")
        }
    }

}

Upvotes: 4

Related Questions