From 0ae44923e9667457a5134ef36c73ab1716dcec18 Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 3 Aug 2019 16:49:46 +0200 Subject: [PATCH] Fixed losing selection on adding items --- .../selection/DefaultSelectionTracker.java | 14 ++++- .../recyclerview/selection/Range.java | 5 ++ patches/selection-updated.patch | 56 +++++++++++++++++++ 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 patches/selection-updated.patch diff --git a/app/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java b/app/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java index a513f5725a..aa523514bc 100644 --- a/app/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java +++ b/app/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java @@ -348,6 +348,10 @@ public class DefaultSelectionTracker extends SelectionTracker { return mRange != null; } + boolean isOverlapping(int position, int count) { + return (mRange != null && mRange.isOverlapping(position, count)); + } + private boolean canSetState(@NonNull K key, boolean nextState) { return mSelectionPredicate.canSetStateForKey(key, nextState); } @@ -578,17 +582,21 @@ public class DefaultSelectionTracker extends SelectionTracker { @Override public void onItemRangeInserted(int startPosition, int itemCount) { - mSelectionTracker.endRange(); + if (mSelectionTracker.isOverlapping(startPosition, itemCount)) + mSelectionTracker.endRange(); } @Override public void onItemRangeRemoved(int startPosition, int itemCount) { - mSelectionTracker.endRange(); + if (mSelectionTracker.isOverlapping(startPosition, itemCount)) + mSelectionTracker.endRange(); } @Override public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { - mSelectionTracker.endRange(); + if (mSelectionTracker.isOverlapping(fromPosition, itemCount) || + mSelectionTracker.isOverlapping(toPosition, itemCount)) + mSelectionTracker.endRange(); } } } diff --git a/app/src/main/java/androidx/recyclerview/selection/Range.java b/app/src/main/java/androidx/recyclerview/selection/Range.java index 35fb3a8ba5..b11a14a9ad 100644 --- a/app/src/main/java/androidx/recyclerview/selection/Range.java +++ b/app/src/main/java/androidx/recyclerview/selection/Range.java @@ -170,6 +170,11 @@ final class Range { mCallbacks.updateForRange(begin, end, selected, type); } + boolean isOverlapping(int position, int count) { + return (position >= mBegin && position <= mEnd) || + (position + count >= mBegin && position + count <= mEnd); + } + @Override public String toString() { return "Range{begin=" + mBegin + ", end=" + mEnd + "}"; diff --git a/patches/selection-updated.patch b/patches/selection-updated.patch new file mode 100644 index 0000000000..e6f05267ca --- /dev/null +++ b/patches/selection-updated.patch @@ -0,0 +1,56 @@ +diff --git a/app/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java b/app/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java +index a513f5725..d8845a0b0 100644 +--- a/app/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java ++++ b/app/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java +@@ -348,6 +348,10 @@ public class DefaultSelectionTracker extends SelectionTracker { + return mRange != null; + } + ++ boolean isOverlapping(int position, int count) { ++ return (mRange != null && mRange.isOverlapping(position, count)); ++ } ++ + private boolean canSetState(@NonNull K key, boolean nextState) { + return mSelectionPredicate.canSetStateForKey(key, nextState); + } +@@ -578,17 +582,21 @@ public class DefaultSelectionTracker + + @Override + public void onItemRangeInserted(int startPosition, int itemCount) { +- mSelectionTracker.endRange(); ++ if (mSelectionTracker.isOverlapping(startPosition, itemCount)) ++ mSelectionTracker.endRange(); + } + + @Override + public void onItemRangeRemoved(int startPosition, int itemCount) { +- mSelectionTracker.endRange(); ++ if (mSelectionTracker.isOverlapping(startPosition, itemCount)) ++ mSelectionTracker.endRange(); + } + + @Override + public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { +- mSelectionTracker.endRange(); ++ if (mSelectionTracker.isOverlapping(fromPosition, itemCount) || ++ mSelectionTracker.isOverlapping(toPosition, itemCount)) ++ mSelectionTracker.endRange(); + } + } + } +diff --git a/app/src/main/java/androidx/recyclerview/selection/Range.java b/app/src/main/java/androidx/recyclerview/selection/Range.java +index 35fb3a8ba..b11a14a9a 100644 +--- a/app/src/main/java/androidx/recyclerview/selection/Range.java ++++ b/app/src/main/java/androidx/recyclerview/selection/Range.java +@@ -170,6 +170,11 @@ final class Range { + mCallbacks.updateForRange(begin, end, selected, type); + } + ++ boolean isOverlapping(int position, int count) { ++ return (position >= mBegin && position <= mEnd) || ++ (position + count >= mBegin && position + count <= mEnd); ++ } ++ + @Override + public String toString() { + return "Range{begin=" + mBegin + ", end=" + mEnd + "}";