From 82a31454cd891da4c0e88105d1f4cfd9561a528c Mon Sep 17 00:00:00 2001 From: MFlisar Date: Sat, 4 Mar 2017 22:11:29 +0100 Subject: [PATCH] small improvements --- .../demo/MainActivity.java | 7 ++- .../DragSelectionProcessor.java | 62 +++++++++++++++---- 2 files changed, 55 insertions(+), 14 deletions(-) diff --git a/demo/src/main/java/com/michaelflisar/dragselectrecyclerview/demo/MainActivity.java b/demo/src/main/java/com/michaelflisar/dragselectrecyclerview/demo/MainActivity.java index f02b011..0472c48 100644 --- a/demo/src/main/java/com/michaelflisar/dragselectrecyclerview/demo/MainActivity.java +++ b/demo/src/main/java/com/michaelflisar/dragselectrecyclerview/demo/MainActivity.java @@ -68,7 +68,12 @@ public HashSet getSelection() { } @Override - public void updateSelection(int start, int end, boolean isSelected) { + public boolean isSelected(int index) { + return mAdapter.getSelection().contains(index); + } + + @Override + public void updateSelection(int start, int end, boolean isSelected, boolean calledFromOnStart) { mAdapter.selectRange(start, end, isSelected); } }) diff --git a/library/src/main/java/com/michaelflisar/dragselectrecyclerview/DragSelectionProcessor.java b/library/src/main/java/com/michaelflisar/dragselectrecyclerview/DragSelectionProcessor.java index 593e49e..9a15b30 100644 --- a/library/src/main/java/com/michaelflisar/dragselectrecyclerview/DragSelectionProcessor.java +++ b/library/src/main/java/com/michaelflisar/dragselectrecyclerview/DragSelectionProcessor.java @@ -37,6 +37,7 @@ public enum Mode private ISelectionStartFinishedListener mStartFinishedListener; private HashSet mOriginalSelection; private boolean mFirstWasSelected; + private boolean mCheckSelectionState = false; /** * @param selectionHandler the handler that takes care to handle the selection events @@ -57,7 +58,7 @@ public DragSelectionProcessor withMode(Mode mode) mMode = mode; return this; } - + /** * @param startFinishedListener a listener that get's notified when the drag selection is started or finished * @return this @@ -68,6 +69,17 @@ public DragSelectionProcessor withStartFinishedListener(ISelectionStartFinishedL return this; } + /** + * If this is enabled, the processor will check if an items selection state is toggled before notifying the {@link ISelectionHandler} + * @param check true, if this check should be enabled + * @return this + */ + public DragSelectionProcessor withCheckSelectionState(boolean check) + { + mCheckSelectionState = check; + return this; + } + @Override public void onSelectionStarted(int start) { @@ -81,22 +93,22 @@ public void onSelectionStarted(int start) { case Simple: { - mSelectionHandler.updateSelection(start, start, true); + mSelectionHandler.updateSelection(start, start, true, true); break; } case ToggleAndUndo: { - mSelectionHandler.updateSelection(start, start, !mOriginalSelection.contains(start)); + mSelectionHandler.updateSelection(start, start, !mOriginalSelection.contains(start), true); break; } case FirstItemDependent: { - mSelectionHandler.updateSelection(start, start, !mFirstWasSelected); + mSelectionHandler.updateSelection(start, start, !mFirstWasSelected, true); break; } case FirstItemDependentToggleAndUndo: { - mSelectionHandler.updateSelection(start, start, !mFirstWasSelected); + mSelectionHandler.updateSelection(start, start, !mFirstWasSelected, true); break; } } @@ -120,45 +132,69 @@ public void onSelectChange(int start, int end, boolean isSelected) { case Simple: { - mSelectionHandler.updateSelection(start, end, isSelected); + if (mCheckSelectionState) + checkedUpdateSelection(start, end, isSelected); + else + mSelectionHandler.updateSelection(start, end, isSelected, false); break; } case ToggleAndUndo: { for (int i = start; i <= end; i++) - mSelectionHandler.updateSelection(i, i, isSelected ? !mOriginalSelection.contains(i) : mOriginalSelection.contains(i)); + checkedUpdateSelection(i, i, isSelected ? !mOriginalSelection.contains(i) : mOriginalSelection.contains(i)); break; } case FirstItemDependent: { - for (int i = start; i <= end; i++) - mSelectionHandler.updateSelection(i, i, isSelected ? !mFirstWasSelected : mFirstWasSelected); + checkedUpdateSelection(start, end, isSelected ? !mFirstWasSelected : mFirstWasSelected); break; } case FirstItemDependentToggleAndUndo: { for (int i = start; i <= end; i++) - mSelectionHandler.updateSelection(i, i, isSelected ? !mFirstWasSelected : mOriginalSelection.contains(i)); + checkedUpdateSelection(i, i, isSelected ? !mFirstWasSelected : mOriginalSelection.contains(i)); break; } } } + private void checkedUpdateSelection(int start, int end, boolean newSelectionState) + { + if (mCheckSelectionState) + { + for (int i = start; i <= end; i++) + { + if (mSelectionHandler.isSelected(i) != newSelectionState) + mSelectionHandler.updateSelection(i, i, newSelectionState, false); + } + } + else + mSelectionHandler.updateSelection(start, end, newSelectionState, false); + } + public interface ISelectionHandler { /** - * Return the currently selected items => can be ignored for {@link Mode#Simple} and {@link Mode#FirstItemDependent} + * @return the currently selected items => can be ignored for {@link Mode#Simple} and {@link Mode#FirstItemDependent} */ Set getSelection(); /** - * update your adapter and select select/unselect the passed index range, you be get a single for all modes but {@link Mode#Simple} + * only used, if {@link DragSelectionProcessor#withCheckSelectionState(boolean)} was enabled + * @param index the index which selection state wants to be known + * @return the current selection state of the passed in index + */ + boolean isSelected(int index); + + /** + * update your adapter and select select/unselect the passed index range, you be get a single for all modes but {@link Mode#Simple} and {@link Mode#FirstItemDependent} * * @param start the first item of the range who's selection state changed * @param end the last item of the range who's selection state changed * @param isSelected true, if the range should be selected, false otherwise + * @param calledFromOnStart true, if it was called from the {@link DragSelectionProcessor#onSelectionStarted(int)} event */ - void updateSelection(int start, int end, boolean isSelected); + void updateSelection(int start, int end, boolean isSelected, boolean calledFromOnStart); } public interface ISelectionStartFinishedListener