From fdb5f8e78310dc9b9f457a19ae560088bf0e6918 Mon Sep 17 00:00:00 2001 From: Carlo Codega Date: Tue, 12 Apr 2022 16:42:02 +0200 Subject: [PATCH 1/2] Stop scrolling when items are no more selectable --- .../DragSelectReceiver.kt | 4 +- .../DragSelectTouchListener.kt | 50 +++++++++++++------ 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/library/src/main/java/com/afollestad/dragselectrecyclerview/DragSelectReceiver.kt b/library/src/main/java/com/afollestad/dragselectrecyclerview/DragSelectReceiver.kt index ee3b0f1..fd0b5a6 100644 --- a/library/src/main/java/com/afollestad/dragselectrecyclerview/DragSelectReceiver.kt +++ b/library/src/main/java/com/afollestad/dragselectrecyclerview/DragSelectReceiver.kt @@ -20,8 +20,6 @@ import androidx.annotation.CheckResult /** @author Aidan Follestad (afollestad) */ interface DragSelectReceiver { - @CheckResult fun getItemCount(): Int - fun setSelected( index: Int, selected: Boolean @@ -29,5 +27,5 @@ interface DragSelectReceiver { @CheckResult fun isSelected(index: Int): Boolean - @CheckResult fun isIndexSelectable(index: Int): Boolean + @CheckResult fun isSelectable(index: Int): Boolean } diff --git a/library/src/main/java/com/afollestad/dragselectrecyclerview/DragSelectTouchListener.kt b/library/src/main/java/com/afollestad/dragselectrecyclerview/DragSelectTouchListener.kt index 76bf610..4503cd7 100644 --- a/library/src/main/java/com/afollestad/dragselectrecyclerview/DragSelectTouchListener.kt +++ b/library/src/main/java/com/afollestad/dragselectrecyclerview/DragSelectTouchListener.kt @@ -36,6 +36,7 @@ enum class Mode { } typealias AutoScrollListener = (scrolling: Boolean) -> Unit +typealias DragToSelectListener = (active: Boolean) -> Unit /** @author Aidan Follestad (afollestad) */ class DragSelectTouchListener private constructor( @@ -46,12 +47,14 @@ class DragSelectTouchListener private constructor( private val autoScrollHandler = Handler() private val autoScrollRunnable = object : Runnable { override fun run() { - if (inTopHotspot) { - recyclerView?.scrollBy(0, -autoScrollVelocity) - autoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY.toLong()) - } else if (inBottomHotspot) { - recyclerView?.scrollBy(0, autoScrollVelocity) - autoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY.toLong()) + if (dragSelectActive) { + if (inTopHotspot) { + recyclerView?.scrollBy(0, -autoScrollVelocity) + autoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY.toLong()) + } else if (inBottomHotspot) { + recyclerView?.scrollBy(0, autoScrollVelocity) + autoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY.toLong()) + } } } } @@ -60,6 +63,7 @@ class DragSelectTouchListener private constructor( var hotspotOffsetTop: Int = 0 var hotspotOffsetBottom: Int = 0 var autoScrollListener: AutoScrollListener? = null + var dragToSelectListener: DragToSelectListener? = null var mode: Mode = RANGE set(mode) { @@ -136,6 +140,11 @@ class DragSelectTouchListener private constructor( active: Boolean, initialSelection: Int ): Boolean { + + if(dragSelectActive != active) { + dragToSelectListener?.invoke(active) + } + if (active && dragSelectActive) { log("Drag selection is already active.") return false @@ -155,7 +164,7 @@ class DragSelectTouchListener private constructor( return false } - if (!receiver.isIndexSelectable(initialSelection)) { + if (!receiver.isSelectable(initialSelection)) { this.dragSelectActive = false this.initialSelection = -1 log("Index $initialSelection is not selectable.") @@ -307,14 +316,14 @@ class DragSelectTouchListener private constructor( to: Int, min: Int, max: Int - ) = with(receiver) { + ) { if (from == to) { // Finger is back on the initial item, unselect everything else for (i in min..max) { if (i == from) { continue } - setSelected(i, false) + unselectItem(i) } return } @@ -322,7 +331,7 @@ class DragSelectTouchListener private constructor( if (to < from) { // When selecting from one to previous items for (i in to..from) { - setSelected(i, true) + if(!selectItem(i)) break } if (min > -1 && min < to) { // Unselect items that were selected during this drag but no longer are @@ -330,18 +339,18 @@ class DragSelectTouchListener private constructor( if (i == from) { continue } - setSelected(i, false) + unselectItem(i) } } if (max > -1) { for (i in from + 1..max) { - setSelected(i, false) + if(!selectItem(i)) break } } } else { // When selecting from one to next items for (i in from..to) { - setSelected(i, true) + if(!selectItem(i)) break } if (max > -1 && max > to) { // Unselect items that were selected during this drag but no longer are @@ -349,14 +358,25 @@ class DragSelectTouchListener private constructor( if (i == from) { continue } - setSelected(i, false) + unselectItem(i) } } if (min > -1) { for (i in min until from) { - setSelected(i, false) + if(!selectItem(i)) break } } } } + + private fun selectItem(index: Int): Boolean = + if (receiver.isSelectable(index)) { + receiver.setSelected(index, true); true + } else { + onDragSelectionStop(); false + } + + private fun unselectItem(index: Int) { + receiver.setSelected(index, false) + } } From a35873c64b99aae0594f963c350f549f85bbe100 Mon Sep 17 00:00:00 2001 From: Carlo Codega Date: Tue, 12 Apr 2022 18:15:00 +0200 Subject: [PATCH 2/2] Fixed sample app --- .../dragselectrecyclerviewsample/RecyclicalTranslator.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sample/src/main/java/com/afollestad/dragselectrecyclerviewsample/RecyclicalTranslator.kt b/sample/src/main/java/com/afollestad/dragselectrecyclerviewsample/RecyclicalTranslator.kt index 2f71d2f..a7e6261 100644 --- a/sample/src/main/java/com/afollestad/dragselectrecyclerviewsample/RecyclicalTranslator.kt +++ b/sample/src/main/java/com/afollestad/dragselectrecyclerviewsample/RecyclicalTranslator.kt @@ -20,7 +20,6 @@ import com.afollestad.recyclical.datasource.SelectableDataSource fun SelectableDataSource<*>.asDragSelectReceiver(): DragSelectReceiver { return object : DragSelectReceiver { - override fun getItemCount(): Int = size() override fun setSelected( index: Int, @@ -31,6 +30,6 @@ fun SelectableDataSource<*>.asDragSelectReceiver(): DragSelectReceiver { override fun isSelected(index: Int): Boolean = isSelectedAt(index) - override fun isIndexSelectable(index: Int): Boolean = true + override fun isSelectable(index: Int): Boolean = true } }