From b5bc77ca4afac4191c5f4b526a8dab800ab584d0 Mon Sep 17 00:00:00 2001 From: limuyang Date: Wed, 2 Aug 2023 12:30:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BA=A4=E6=8D=A2=E5=85=83=E7=B4=A0?= =?UTF-8?q?=E4=BA=A7=E7=94=9F=E7=9A=84=E6=95=B0=E7=BB=84=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dragswipe/DefaultDragAndSwipeActivity.kt | 19 +++++++--- .../dragswipe/DragAndSwipeDifferActivity.kt | 8 ++--- .../dragswipe/HeaderDragAndSwipeActivity.kt | 10 ++++-- .../ManualDragAndSwipeUseActivity.java | 4 +-- .../adapter/DragAndSwipeAdapter.java | 20 ++++------- .../adapter/HeaderDragAndSwipeAdapter.kt | 4 +-- .../utils/VibratorUtils.kt | 35 ++++++++----------- .../library/adapter/base/BaseDifferAdapter.kt | 13 +++++-- .../library/adapter/base/BaseQuickAdapter.kt | 21 +++++++++-- .../base/dragswipe/QuickDragAndSwipe.kt | 2 +- .../listener/DragAndSwipeDataCallback.kt | 5 ++- 11 files changed, 85 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/DefaultDragAndSwipeActivity.kt b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/DefaultDragAndSwipeActivity.kt index 08155295b..e4118fa64 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/DefaultDragAndSwipeActivity.kt +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/DefaultDragAndSwipeActivity.kt @@ -6,14 +6,14 @@ import android.graphics.Color import android.os.Build import android.os.Bundle import android.util.Log +import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper -import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.chad.baserecyclerviewadapterhelper.activity.dragswipe.adapter.DragAndSwipeAdapter import com.chad.baserecyclerviewadapterhelper.base.BaseViewBindingActivity import com.chad.baserecyclerviewadapterhelper.databinding.ActivityUniversalRecyclerBinding import com.chad.baserecyclerviewadapterhelper.utils.Tips -import com.chad.baserecyclerviewadapterhelper.utils.VibratorUtils.vibrate +import com.chad.baserecyclerviewadapterhelper.utils.vibrate import com.chad.library.adapter.base.dragswipe.QuickDragAndSwipe import com.chad.library.adapter.base.dragswipe.listener.OnItemDragListener import com.chad.library.adapter.base.dragswipe.listener.OnItemSwipeListener @@ -28,7 +28,8 @@ class DefaultDragAndSwipeActivity : BaseViewBindingActivity> w 顺序 ${it} " + ) + } + } } val swipeListener: OnItemSwipeListener = object : OnItemSwipeListener { diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/DragAndSwipeDifferActivity.kt b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/DragAndSwipeDifferActivity.kt index 796b8203c..cf352e0d2 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/DragAndSwipeDifferActivity.kt +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/DragAndSwipeDifferActivity.kt @@ -13,7 +13,7 @@ import com.chad.baserecyclerviewadapterhelper.activity.dragswipe.adapter.DiffDra import com.chad.baserecyclerviewadapterhelper.base.BaseViewBindingActivity import com.chad.baserecyclerviewadapterhelper.data.DataServer import com.chad.baserecyclerviewadapterhelper.databinding.ActivityUniversalRecyclerBinding -import com.chad.baserecyclerviewadapterhelper.utils.VibratorUtils.vibrate +import com.chad.baserecyclerviewadapterhelper.utils.vibrate import com.chad.library.adapter.base.dragswipe.QuickDragAndSwipe import com.chad.library.adapter.base.dragswipe.listener.DragAndSwipeDataCallback import com.chad.library.adapter.base.dragswipe.listener.OnItemDragListener @@ -30,7 +30,7 @@ class DragAndSwipeDifferActivity : BaseViewBindingActivity Log.d(TAG, "drag start") - vibrate(applicationContext) + vibrate() val holder = viewHolder as QuickViewHolder // 开始时,item背景色变化,demo这里使用了一个动画渐变,使得自然 val startColor = Color.WHITE diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/ManualDragAndSwipeUseActivity.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/ManualDragAndSwipeUseActivity.java index c49048825..59904d6be 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/ManualDragAndSwipeUseActivity.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/ManualDragAndSwipeUseActivity.java @@ -16,7 +16,7 @@ import com.chad.baserecyclerviewadapterhelper.base.BaseViewBindingActivity; import com.chad.baserecyclerviewadapterhelper.databinding.ActivityUniversalRecyclerBinding; import com.chad.baserecyclerviewadapterhelper.utils.Tips; -import com.chad.baserecyclerviewadapterhelper.utils.VibratorUtils; +import com.chad.baserecyclerviewadapterhelper.utils.VibratorUtilsKt; import com.chad.library.adapter.base.QuickAdapterHelper; import com.chad.library.adapter.base.dragswipe.QuickDragAndSwipe; import com.chad.library.adapter.base.dragswipe.listener.OnItemDragListener; @@ -63,7 +63,7 @@ protected void onCreate(Bundle savedInstanceState) { OnItemDragListener listener = new OnItemDragListener() { @Override public void onItemDragStart(@Nullable RecyclerView.ViewHolder viewHolder, int pos) { - VibratorUtils.INSTANCE.vibrate(getApplicationContext()); + VibratorUtilsKt.vibrate(getApplicationContext()); Log.d(TAG, "drag start"); final QuickViewHolder holder = ((QuickViewHolder) viewHolder); if (holder == null) return; diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/adapter/DragAndSwipeAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/adapter/DragAndSwipeAdapter.java index e08258f28..77b5363da 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/adapter/DragAndSwipeAdapter.java +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/adapter/DragAndSwipeAdapter.java @@ -22,24 +22,18 @@ protected QuickViewHolder onCreateViewHolder(@NonNull Context context, @NonNull @Override protected void onBindViewHolder(@NonNull QuickViewHolder holder, int position, String item) { switch (holder.getLayoutPosition() % 3) { - case 0: - holder.setImageResource(R.id.iv_head, R.mipmap.head_img0); - break; - case 1: - holder.setImageResource(R.id.iv_head, R.mipmap.head_img1); - break; - case 2: - holder.setImageResource(R.id.iv_head, R.mipmap.head_img2); - break; - default: - break; + case 0 -> holder.setImageResource(R.id.iv_head, R.mipmap.head_img0); + case 1 -> holder.setImageResource(R.id.iv_head, R.mipmap.head_img1); + case 2 -> holder.setImageResource(R.id.iv_head, R.mipmap.head_img2); + default -> { + } } holder.setText(R.id.tv, item); } @Override - public void dataSwap(int fromPosition, int toPosition) { - swap(fromPosition, toPosition); + public void dataMove(int fromPosition, int toPosition) { + move(fromPosition, toPosition); } @Override diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/adapter/HeaderDragAndSwipeAdapter.kt b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/adapter/HeaderDragAndSwipeAdapter.kt index bc346a274..3f7e99675 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/adapter/HeaderDragAndSwipeAdapter.kt +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/dragswipe/adapter/HeaderDragAndSwipeAdapter.kt @@ -31,8 +31,8 @@ open class HeaderDragAndSwipeAdapter : BaseQuickAdapter holder.setText(R.id.tv, item) } - override fun dataSwap(fromPosition: Int, toPosition: Int) { - swap(fromPosition, toPosition) + override fun dataMove(fromPosition: Int, toPosition: Int) { + move(fromPosition, toPosition) } override fun dataRemoveAt(position: Int) { diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/utils/VibratorUtils.kt b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/utils/VibratorUtils.kt index e6bda0c5f..b81e85dc2 100644 --- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/utils/VibratorUtils.kt +++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/utils/VibratorUtils.kt @@ -8,26 +8,21 @@ import android.os.Vibrator import android.os.VibratorManager /** - * 震动类 + * 震动 */ -object VibratorUtils { - /** - * * 轻微的震动提醒 - */ - fun vibrate(context: Context) { - if (Build.VERSION.SDK_INT >= 31) { - // android 12 及以上使用新的 VibratorManager,创建 EFFECT_TICK 轻微震动(需要线性震动马达硬件支持) - val manager: VibratorManager = - context.getSystemService(VibratorManager::class.java) - manager.defaultVibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK)) - } else if (Build.VERSION.SDK_INT >= 29) { - // android 10 及以上使用原 Vibrator,创建 EFFECT_TICK 轻微震动(需要线性震动马达硬件支持) - val vib = context.getSystemService(Vibrator::class.java) as Vibrator - vib.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK)) - } else { - // 10 以下的系统,没有系统 API 驱动线性震动马达,只能创建普通震动 - val vib = context.getSystemService(Service.VIBRATOR_SERVICE) as Vibrator //震动70毫秒 - vib.vibrate(70) - } +fun Context.vibrate() { + if (Build.VERSION.SDK_INT >= 31) { + // android 12 及以上使用新的 VibratorManager,创建 EFFECT_TICK 轻微震动(需要线性震动马达硬件支持) + val manager: VibratorManager = + getSystemService(VibratorManager::class.java) + manager.defaultVibrator.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK)) + } else if (Build.VERSION.SDK_INT >= 29) { + // android 10 及以上使用原 Vibrator,创建 EFFECT_TICK 轻微震动(需要线性震动马达硬件支持) + val vib = getSystemService(Vibrator::class.java) as Vibrator + vib.vibrate(VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK)) + } else { + // 10 以下的系统,没有系统 API 驱动线性震动马达,只能创建普通震动 + val vib = getSystemService(Service.VIBRATOR_SERVICE) as Vibrator //震动70毫秒 + vib.vibrate(70) } } \ No newline at end of file diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseDifferAdapter.kt b/library/src/main/java/com/chad/library/adapter/base/BaseDifferAdapter.kt index ebc9215ca..56c4ab265 100644 --- a/library/src/main/java/com/chad/library/adapter/base/BaseDifferAdapter.kt +++ b/library/src/main/java/com/chad/library/adapter/base/BaseDifferAdapter.kt @@ -152,12 +152,21 @@ abstract class BaseDifferAdapter( } override fun swap(fromPosition: Int, toPosition: Int) { - val size = items.size - if (fromPosition in 0 until size || toPosition in 0 until size) { + if (fromPosition in items.indices || toPosition in items.indices) { items.toMutableList().also { Collections.swap(it, fromPosition, toPosition) submitList(it) } } } + + override fun move(fromPosition: Int, toPosition: Int) { + if (fromPosition in items.indices || toPosition in items.indices) { + items.toMutableList().also { + val e = it.removeAt(fromPosition) + it.add(toPosition, e) + submitList(it) + } + } + } } \ No newline at end of file diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.kt b/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.kt index 995c00030..3d20e763b 100644 --- a/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.kt +++ b/library/src/main/java/com/chad/library/adapter/base/BaseQuickAdapter.kt @@ -623,15 +623,30 @@ abstract class BaseQuickAdapter( /** * Item swap - * 数据位置交换 + * 数据位置交换。这里单纯的只是两个数据交换位置。(注意⚠️,这里移动后的数据顺序与 [move] 不同) * * @param fromPosition * @param toPosition */ open fun swap(fromPosition: Int, toPosition: Int) { - val size = items.size - if (fromPosition in 0 until size && toPosition in 0 until size) { + if (fromPosition in items.indices && toPosition in items.indices) { Collections.swap(items, fromPosition, toPosition) + notifyItemChanged(fromPosition) + notifyItemChanged(toPosition) + } + } + + /** + * Move Item + * item 位置的移动。(注意⚠️,这里移动后的数据顺序与 [swap] 不同) + * + * @param fromPosition + * @param toPosition + */ + open fun move(fromPosition: Int, toPosition: Int) { + if (fromPosition in items.indices && toPosition in items.indices) { + val e = mutableItems.removeAt(fromPosition) + mutableItems.add(toPosition, e) notifyItemMoved(fromPosition, toPosition) } } diff --git a/library/src/main/java/com/chad/library/adapter/base/dragswipe/QuickDragAndSwipe.kt b/library/src/main/java/com/chad/library/adapter/base/dragswipe/QuickDragAndSwipe.kt index c40443e00..c6c4a4d7d 100644 --- a/library/src/main/java/com/chad/library/adapter/base/dragswipe/QuickDragAndSwipe.kt +++ b/library/src/main/java/com/chad/library/adapter/base/dragswipe/QuickDragAndSwipe.kt @@ -190,7 +190,7 @@ open class QuickDragAndSwipe : ItemTouchHelper.Callback() { if (fromPosition == RecyclerView.NO_POSITION || toPosition == RecyclerView.NO_POSITION) return // 进行位置的切换 - _dataCallback?.dataSwap(fromPosition, toPosition) + _dataCallback?.dataMove(fromPosition, toPosition) mOnItemDragListener?.onItemDragMoving(viewHolder, fromPosition, target, toPosition) } diff --git a/library/src/main/java/com/chad/library/adapter/base/dragswipe/listener/DragAndSwipeDataCallback.kt b/library/src/main/java/com/chad/library/adapter/base/dragswipe/listener/DragAndSwipeDataCallback.kt index 421aac04f..46573c13a 100644 --- a/library/src/main/java/com/chad/library/adapter/base/dragswipe/listener/DragAndSwipeDataCallback.kt +++ b/library/src/main/java/com/chad/library/adapter/base/dragswipe/listener/DragAndSwipeDataCallback.kt @@ -1,11 +1,14 @@ package com.chad.library.adapter.base.dragswipe.listener +/** + * 由外部实现的数据操作 + */ interface DragAndSwipeDataCallback { /** * item 数据交换 */ - fun dataSwap(fromPosition: Int, toPosition: Int) + fun dataMove(fromPosition: Int, toPosition: Int) /** * 删除 Item 数据