From 18d60ff39c06bb465b46bf0e30d8f5ae1f58e238 Mon Sep 17 00:00:00 2001 From: drake Date: Tue, 16 Jul 2024 13:28:29 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20#447=20=E5=A6=82=E6=9E=9C=E6=8B=96?= =?UTF-8?q?=E6=8B=BD=E8=B5=B7=E5=A7=8B=E4=BD=8D=E7=BD=AE=E7=AD=89=E4=BA=8E?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E4=BD=8D=E7=BD=AE=E5=88=99=E5=B1=9E=E4=BA=8E?= =?UTF-8?q?=E6=97=A0=E6=95=88=E7=A7=BB=E5=8A=A8,=20=E4=B8=8D=E5=9B=9E?= =?UTF-8?q?=E8=B0=83onDrag=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../brv/listener/DefaultItemTouchCallback.kt | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/brv/src/main/java/com/drake/brv/listener/DefaultItemTouchCallback.kt b/brv/src/main/java/com/drake/brv/listener/DefaultItemTouchCallback.kt index ed8eade8..8b8dd7cc 100644 --- a/brv/src/main/java/com/drake/brv/listener/DefaultItemTouchCallback.kt +++ b/brv/src/main/java/com/drake/brv/listener/DefaultItemTouchCallback.kt @@ -111,7 +111,7 @@ open class DefaultItemTouchCallback : ItemTouchHelper.Callback() { } /** - * 当拖拽动作完成且松开手指时触发 + * 当拖拽动作完成且松开手指时触发, 如果拖拽起始位置等于目标位置则属于无效移动, 不回调当前方法 * @param source 触发拖拽的Item * @param target 拖拽目标的Item */ @@ -125,21 +125,25 @@ open class DefaultItemTouchCallback : ItemTouchHelper.Callback() { /** * 拖拽或者侧滑导致的状态变化 - * @param viewHolder 当前触发的Item + * @param vh 当前触发的Item * @param actionState 触发的状态 * @see ItemTouchHelper.ACTION_STATE_DRAG 拖拽 * @see ItemTouchHelper.ACTION_STATE_SWIPE 侧滑 * @see ItemTouchHelper.ACTION_STATE_IDLE 闲置 */ - override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { + override fun onSelectedChanged(vh: RecyclerView.ViewHolder?, actionState: Int) { when (actionState) { ItemTouchHelper.ACTION_STATE_IDLE -> { + val source = sourceViewHolder + val target = targetViewHolder if (lastActionState == ItemTouchHelper.ACTION_STATE_DRAG && - sourceViewHolder is BindingViewHolder && - targetViewHolder is BindingViewHolder + source is BindingViewHolder && target is BindingViewHolder && + startMovingPosition != target.bindingAdapterPosition ) { - onDrag(sourceViewHolder!!, targetViewHolder!!) + onDrag(source, target) } + // 手指放下, 重置起始移动位置 + startMovingPosition = null } else -> { @@ -148,6 +152,9 @@ open class DefaultItemTouchCallback : ItemTouchHelper.Callback() { } } + /**记录开始移动位置, 如果拖拽起始位置等于目标位置则属于无效移动*/ + private var startMovingPosition: Int? = null + /** * 拖拽移动超过其他item时, 其返回值表示是否已经拖拽替换(会触发函数onMoved) * @return 返回false 禁止被拖拽交换移动 @@ -169,6 +176,10 @@ open class DefaultItemTouchCallback : ItemTouchHelper.Callback() { models.removeAt(fromPosition) models.add(toPosition, fromItem) adapter.notifyItemMoved(currentPosition, targetPosition) + // 记录起始移动位置 + if (startMovingPosition == null) { + startMovingPosition = source.bindingAdapterPosition + } sourceViewHolder = source targetViewHolder = target return true