/ 开源项目  

EditAdapter 让 RecyclerView 快速集成列表编辑模式

ic_launcher-web

最近项目有个需求,需要在收藏列表增加编辑模式,包括全选、删除、长按进入编辑模式等,于是对Adapter进行了一下封装,并开源出来,一起交流学习

演示

demo

添加EditAdapter到你的项目

  1. 在项目的 build.gradle 中添加:
1
2
3
4
5
6
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
  1. 添加依赖
1
2
3
4
//TAG替换为上方的最新版本号
dependencies {
implementation 'com.github.plain-dev:EditAdapter:vTAG'
}

如何使用

  1. 在你的数据实体类中继承SelectedBean
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyDataBean extends SelectedBean {

private String title;
private String content;

public MyDataBean(String title, String content) {
this.title = title;
this.content = content;
}

......

}
  1. 创建一个适配器,继承自EditAdapter<T extends ISelected>
1
2
3
4
5
public class MyEditAdapter extends EditAdapter<MyDataBean> {

......

}
  1. 在构造方法中指定数据和布局
1
2
3
public MyEditAdapter(List<MyDataBean> list) {
super(list, R.layout.item_edit,R.layout.item_empty);
}
  1. 创建数据视图和空数据视图
1
2
3
4
5
6
7
8
9
@Override
protected BaseEditViewHolder createViewHolder(View itemView) {
return new MyViewHolder(itemView);
}

@Override
protected BaseEditViewHolder createEmptyViewHolder(View itemView) {
return new EmptyViewHolder(itemView);
}
  1. 指定触摸模式

TOUCH_MODE_ROOT: 点击整个item选中

TOUCH_MODE_CHILD: 点击CheckBox选中

1
2
3
4
5
@Override
protected int getTouchMode() {
//指定触摸选择模式
return EditAdapter.TOUCH_MODE_ROOT;
}
  1. 数据绑定
1
2
3
4
5
6
7
8
@Override
protected void convert(MyDataBean item, BaseEditViewHolder vh) {
if (vh instanceof MyViewHolder){
MyViewHolder viewHolder = (MyViewHolder) vh;
viewHolder.tvTitle.setText(item.getTitle());
viewHolder.tvContent.setText(item.getContent());
}
}
  1. 自定义ViewHolder,继承BaseEditViewHolder,并重写getHideViewgetCheckBox方法,返回隐藏区域View和选择按钮
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static class MyViewHolder extends BaseEditViewHolder {

public MyViewHolder(@NonNull View itemView) {
super(itemView);
......
}

@Override
public View getHideView() {
return checkBox;
}

@Override
public CheckBox getCheckBox() {
return checkBox;
}
}
  1. ActivityFragment中更新UI

    • 指定模式为EDIT_MODE(进入编辑模式)

      1
      myEditAdapter.changeMode(EditAdapter.EDIT_MODE);
    • 指定模式为SHOW_MODE(退出编辑模式)

      1
      myEditAdapter.changeMode(EditAdapter.SHOW_MODE);
    • 全选所有项

      1
      myEditAdapter.selectedAllItem();
    • 反选所有项

      1
      myEditAdapter.unSelectedAllItem();
    • 删除选择项

      1
      myEditAdapter.removeSelectedItem();
    • 判断是否选择全部 (用来判断点击全选按钮时,应该调用selectedAllItem还是unSelectedAllItem)

      1
      myEditAdapter.isSelectedAllItem()
  2. 注册事件监听器

1
2
3
4
5
6
7
8
9
10
11
12
13
myEditAdapter.setEditSelectedListener(new IEditSelectedListener() {
//回调当前选中项数量
@Override
public void onSelectedItemCount(int count) {
tvCheckItemCount.setText(String.format("共选中%s项", count));
}

//回调长按进入编辑模式
@Override
public void onLongClickEnterEditMode() {
myEditAdapter.changeMode(EditAdapter.EDIT_MODE);
}
});

10、如果使用下拉刷新控件,记得在进入编辑模式后,关闭下拉刷新,以SmartRefreshLayout为例

进入编辑模式后

1
smartRefreshLayout.setEnableRefresh(false);

退出编辑模式后

1
smartRefreshLayout.setEnableRefresh(true);

🔎详细用法欢迎进入仓库查看Demo

更新日志

v1.0.3-alpha

本次更新内容如下

  • fix:手动选择全部item后,再次点击全选按钮无效的问题
  • add:为解决上述bug,新增一个方法判断当前是否选择全部

v1.0.2-alpha

本次更新内容如下

  • add:长按进入编辑模式
  • add:设置空数据视图
  • modify:优化代码逻辑

v1.0.1-alpha

本次更新内容如下

  • fix:滑到最底部删除元素时发生”Inconsistency detected”的问题

v1.0-alpha

  • 首个预览版
  • 有些问题,请使用新版

其它

  1. 有问题欢迎提交issues
  2. 状态图标来源iconfont,侵删