RecycleView系列十:长按多选

257 阅读2分钟

在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>

注意:focusablefocusableInTouchMode被设置为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属性没有设置为singleChoicemultipleChoice,因为这些模式是为ListView设计的,不适用于RecyclerView。
  • 如果你不希望每个Item都能通过点击CheckBox之外的地方来切换选中状态,确保不要为ItemView设置点击监听器或在监听器中阻止事件传播。
  • 如果需要实现类似微信的全选功能,你可以在Toolbar上添加一个CheckBox,并为其设置监听器来更新所有Item的选中状态。