RecyclerView中的Selection

RecyclerView相关的文章预计会写六篇,此处是第四篇

  1. RecyclerView中的position
  2. RecyclerView中的DiffUtil
  3. RecyclerView中的SnapHelper
  4. RecyclerView中的Selection
  5. RecyclerView中的ConcatAdapter
  6. RecyclerView中的Glide预加载
  7. RecyclerView源码浅析

RecyclerView的选中也是比较常见的需求,你是怎么实现RecyclerView选中效果的呢,可以在评论区分享一下。
在学习RecyclerView的selection之前,咱们先复习一下ListView的选中实现方式。

ListView的选中实现方式

ListView提供4中选中模式,CHOICE_MODE_NONE,CHOICE_MODE_SINGLE,CHOICE_MODE_MULTIPLE和CHOICE_MODE_MULTIPLE_MODAL。
设置选择模式之后,点击item会按照选择模式进行操作,可以参考AbsListView#performItemClick

@Override
    public boolean performItemClick(View view, int position, long id) {
        boolean handled = false;
        boolean dispatchItemClick = true;

        if (mChoiceMode != CHOICE_MODE_NONE) {
            handled = true;
            boolean checkedStateChanged = false;

            if (mChoiceMode == CHOICE_MODE_MULTIPLE ||
                    (mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mChoiceActionMode != null)) {
                boolean checked = !mCheckStates.get(position, false);
                mCheckStates.put(position, checked);
                if (mCheckedIdStates != null && mAdapter.hasStableIds()) {
                    if (checked) {
                        mCheckedIdStates.put(mAdapter.getItemId(position), position);
                    } else {
                        mCheckedIdStates.delete(mAdapter.getItemId(position));
                    }
                }
                if (checked) {
                    mCheckedItemCount++;
                } else {
                    mCheckedItemCount--;
                }
                if (mChoiceActionMode != null) {
                    mMultiChoiceModeCallback.onItemCheckedStateChanged(mChoiceActionMode,
                            position, id, checked);
                    dispatchItemClick = false;
                }
                checkedStateChanged = true;
            } else if (mChoiceMode == CHOICE_MODE_SINGLE) {
                boolean checked = !mCheckStates.get(position, false);
                if (checked) {
                    mCheckStates.clear();
                    mCheckStates.put(position, true);
                    if (mCheckedIdStates != null && mAdapter.hasStableIds()) {
                        mCheckedIdStates.clear();
                        mCheckedIdStates.put(mAdapter.getItemId(position), position);
                    }
                    mCheckedItemCount = 1;
                } else if (mCheckStates.size() == 0 || !mCheckStates.valueAt(0)) {
                    mCheckedItemCount = 0;
                }
                checkedStateChanged = true;
            }

            if (checkedStateChanged) {
                updateOnScreenCheckedViews();
            }
        }

        if (dispatchItemClick) {
            handled |= super.performItemClick(view, position, id);
        }

        return handled;
    }

AbsListView同样提供了很多实用的方法 getCheckedItemPositions,getCheckedItemIds,getCheckedItemCount,clearChoices等。

RecyclerView的选中实现方式

如果不使用selection SDK,之前咱们都是怎么实现选中效果的呢?
最普遍的方式可能是有一个变量记录当前是否选择模式,选择模式下显示选择样式,选中之后记录选中位置。

参考:
1、高级 RecyclerView 自定义
2、androidx.recyclerview.selection

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容