diff --git a/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java b/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java index 66aeadfe3..643ce7a05 100644 --- a/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java +++ b/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java @@ -343,6 +343,17 @@ public SelectionCreator setOnCheckedListener(@Nullable OnCheckedListener listene return this; } + /** + * Set if selection should change on case where maxSelectable is 1 + * + * @param changeSelectionOnSelectingOne + * @return {@link SelectionCreator} for fluent API. + */ + public SelectionCreator setChangeSelectionOnSelectingOne(boolean changeSelectionOnSelectingOne) { + mSelectionSpec.changeSelectionOnSelectingOne = changeSelectionOnSelectingOne; + return this; + } + /** * Start to select media and wait for result. * diff --git a/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java b/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java index 80b7d1098..e0b244e81 100644 --- a/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java +++ b/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java @@ -57,6 +57,7 @@ public final class SelectionSpec { public int originalMaxSize; public OnCheckedListener onCheckedListener; public boolean showPreview; + public boolean changeSelectionOnSelectingOne; private SelectionSpec() { } @@ -93,6 +94,7 @@ private void reset() { autoHideToobar = false; originalMaxSize = Integer.MAX_VALUE; showPreview = true; + changeSelectionOnSelectingOne = false; } public boolean singleSelectionModeEnabled() { diff --git a/matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java b/matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java index 7fdf69034..63186b102 100644 --- a/matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java +++ b/matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java @@ -167,7 +167,9 @@ public boolean isSelected(Item item) { } public IncapableCause isAcceptable(Item item) { - if (maxSelectableReached()) { + if (shouldRemoveSelection()) { + mItems.clear(); + } else if (maxSelectableReached()) { int maxSelectable = currentMaxSelectable(); String cause; @@ -201,6 +203,11 @@ public boolean maxSelectableReached() { return mItems.size() == currentMaxSelectable(); } + public boolean shouldRemoveSelection() { + SelectionSpec spec = SelectionSpec.getInstance(); + return mItems.size() == 1 && currentMaxSelectable() == 1 && spec.changeSelectionOnSelectingOne; + } + // depends private int currentMaxSelectable() { SelectionSpec spec = SelectionSpec.getInstance();