RecyclerView相关的文章预计会写六篇,此处是第四篇
- RecyclerView中的position
- RecyclerView中的DiffUtil
- RecyclerView中的SnapHelper
- RecyclerView中的Selection
- RecyclerView中的ConcatAdapter
- RecyclerView中的Glide预加载
- 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,之前咱们都是怎么实现选中效果的呢?
最普遍的方式可能是有一个变量记录当前是否选择模式,选择模式下显示选择样式,选中之后记录选中位置。