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 + "}";