From a0ff84f896af72f34218f829fd321ec90c2dc1ed Mon Sep 17 00:00:00 2001 From: jrfeng Date: Sat, 21 Nov 2020 10:44:17 +0800 Subject: [PATCH] feature: add 'OnSelectCountChangeListener' --- .../helper/SelectableAdapter.java | 9 +++++ .../recyclerview/helper/SelectableHelper.java | 33 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/helper/src/main/java/recyclerview/helper/SelectableAdapter.java b/helper/src/main/java/recyclerview/helper/SelectableAdapter.java index b429d66..50652fa 100644 --- a/helper/src/main/java/recyclerview/helper/SelectableAdapter.java +++ b/helper/src/main/java/recyclerview/helper/SelectableAdapter.java @@ -78,6 +78,15 @@ public void setSelectMode(SelectableHelper.SelectMode mode) { mSelectableHelper.setSelectMode(mode); } + /** + * 设置一个用于监听 “选中数量” 改变的监听器。 + * + * @param listener 监听器,可为 null。为 null 时将清除上次设置的监听器。 + */ + public void setOnSelectCountChangeListener(SelectableHelper.OnSelectCountChangeListener listener) { + mSelectableHelper.setOnSelectCountChangeListener(listener); + } + /** * 查询某个列表项是否已被选中。 * diff --git a/helper/src/main/java/recyclerview/helper/SelectableHelper.java b/helper/src/main/java/recyclerview/helper/SelectableHelper.java index 6edcd0f..c80adc6 100644 --- a/helper/src/main/java/recyclerview/helper/SelectableHelper.java +++ b/helper/src/main/java/recyclerview/helper/SelectableHelper.java @@ -61,6 +61,7 @@ public class SelectableHelper { private List mSelectedPositions; private RecyclerView.AdapterDataObserver mAdapterDataObserver; + private OnSelectCountChangeListener mOnSelectCountChangeListener; public SelectableHelper(@NonNull RecyclerView.Adapter adapter) { NonNullUtil.requireNonNull(adapter); @@ -135,6 +136,16 @@ public void clearSelected() { for (Integer selectedPosition : mSelectedPositions.subList(0, mSelectedPositions.size())) { deselect(selectedPosition); } + notifySelectCountChanged(); + } + + /** + * 设置一个用于监听 “选中数量” 改变的监听器。 + * + * @param listener 监听器,可为 null。为 null 时将清除上次设置的监听器。 + */ + public void setOnSelectCountChangeListener(@Nullable OnSelectCountChangeListener listener) { + mOnSelectCountChangeListener = listener; } /** @@ -206,6 +217,8 @@ public void onItemRangeRemoved(int positionStart, int itemCount) { mSelectedPositions.add(selectedItem - itemCount); } } + + notifySelectCountChanged(); } @Override @@ -268,6 +281,7 @@ private void select(int position) { } mSelectedPositions.add(position); + notifySelectCountChanged(); if (mRecyclerView == null) { return; @@ -287,6 +301,7 @@ private void deselect(int position) { // 要手动装箱, 否则调用的是 remove(int):E 方法, 而不是 remove(Object):boolean 方法 mSelectedPositions.remove(Integer.valueOf(position)); + notifySelectCountChanged(); if (mRecyclerView == null) { return; @@ -301,6 +316,12 @@ private void deselect(int position) { } } + private void notifySelectCountChanged() { + if (mOnSelectCountChangeListener != null) { + mOnSelectCountChangeListener.onSelectCountChanged(mSelectedPositions.size()); + } + } + /** * 选择模式。 */ @@ -320,4 +341,16 @@ public interface Selectable { void onUnselected(); } + + /** + * 监听选中数量改变的。 + */ + public interface OnSelectCountChangeListener { + /** + * 当选中的列表项的数量发生改变时会回调该方法。 + * + * @param selectedCount 当前的选中数量 + */ + void onSelectCountChanged(int selectedCount); + } }