在RecyclerView中实现长按多选模式,并自定义多选样式(如勾选框、勾选数量提示、勾选标题提示等),通常需要自定义RecyclerView.Adapter中的一些方法,并在每个Item的视图中添加用于显示勾选状态的控件(如CheckBox或ImageView)。此外,还需要维护一个状态列表来跟踪哪些项目被选中。
以下是一个基本的实现步骤和代码示例:
1. 准备Item布局
首先,你需要准备一个包含勾选框(可以使用CheckBox或ImageView来模拟)的RecyclerView Item布局。
<!-- item_list.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false" />
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Item Title"
android:textSize="18sp"
android:paddingStart="16dp"
android:paddingEnd="16dp" />
</LinearLayout>
注意:focusable和focusableInTouchMode被设置为false以防止CheckBox抢夺RecyclerView的触摸事件。
2. 维护选中状态
在Adapter中,你需要一个数组或列表来跟踪哪些项被选中。
private boolean[] isSelected;
// 在构造函数中初始化
public MyAdapter(List<String> data) {
this.data = data;
this.isSelected = new boolean[data.size()];
}
3. 修改ViewHolder以包含选中逻辑
在ViewHolder中,添加对CheckBox(或自定义勾选控件)的监听,并更新选中状态。
public class ViewHolder extends RecyclerView.ViewHolder {
CheckBox checkBox;
TextView textView;
public ViewHolder(View itemView) {
super(itemView);
checkBox = itemView.findViewById(R.id.checkBox);
textView = itemView.findViewById(R.id.textView);
// 长按事件(如果需要的话)
itemView.setOnLongClickListener(v -> {
toggleSelection(getAdapterPosition());
return true; // 消耗长按事件,防止触发RecyclerView的拖拽事件
});
// 点击CheckBox来切换选中状态
checkBox.setOnClickListener(v -> toggleSelection(getAdapterPosition()));
}
void bind(String item, int position) {
textView.setText(item);
checkBox.setChecked(isSelected[position]);
}
void toggleSelection(int position) {
isSelected[position] = !isSelected[position];
checkBox.setChecked(isSelected[position]);
// 更新顶部提示(如果有的话)
updateSelectionCount();
}
}
4. 更新顶部提示
在Adapter中添加一个方法来更新顶部或任何地方的选中项提示。
private void updateSelectionCount() {
int count = 0;
for (boolean selected : isSelected) {
if (selected) count++;
}
// 这里可以根据实际情况更新UI,比如设置Toolbar的标题或显示一个Toast
// 例如:Toast.makeText(context, "Selected: " + count, Toast.LENGTH_SHORT).show();
}
5. 启用/禁用多选模式
你可能还需要一个全局的方法来控制多选模式的启用和禁用,这可以通过设置CheckBox的可见性或监听器来实现。
6. 注意
- 确保RecyclerView的
android:choiceMode属性没有设置为singleChoice或multipleChoice,因为这些模式是为ListView设计的,不适用于RecyclerView。 - 如果你不希望每个Item都能通过点击CheckBox之外的地方来切换选中状态,确保不要为ItemView设置点击监听器或在监听器中阻止事件传播。
- 如果需要实现类似微信的全选功能,你可以在Toolbar上添加一个CheckBox,并为其设置监听器来更新所有Item的选中状态。