Tengo la función RecyclerView Drag & Drop, pero me gustaría hacer algunos cálculos onDrop. Cuando coloco mi función expensiveFunction() en onMove() , se activa en cada cambio de posición hasta que finaliza el arrastre. Eso es una gran exageración. ¿Hay alguna manera de activar la función en el extremo de arrastre?
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 } }Puede anular onSelectedChanged() que se llama cuando el ViewHolder o arrastra el ItemTouchHelper .
Para capturar la acción de soltar, examine el valor de actionState para que sea 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") } } }