Android Recyclerview实现多选,单选,全选,反选,批量删除的功能

发布时间 - 2026-01-11 01:52:49    点击率:

效果图如下:

 

 

Recyclerview 实现多选,单选,全选,反选,批量删除的步骤

1.在Recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件

2.这里选中的控件没有用checkbox来做,用的是imageview,选中和不选中其实是两张图片

3.默认是不显示选中的控件的,点击编辑的时候显示,点击取消的时候隐藏

4.通过adapter和activity数据之间的传递,然后进行具体的操作

具体代码如下:

在recyclerview的布局中写全选,反选,删除,计数等相应的控件

 <LinearLayout
  android:id="@+id/ll_mycollection_bottom_dialog"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="vertical"
  android:layout_gravity="bottom"
  android:visibility="gone"
  android:background="@color/app_bg">

  <View
   android:background="#e5e5e5"
   android:layout_width="match_parent"
   android:layout_height="1px"/>

  <RelativeLayout
   android:background="@color/white"
   android:layout_width="match_parent"
   android:layout_height="@dimen/px_90">


   <TextView
    android:layout_centerVertical="true"
    android:id="@+id/tv"
    android:textColor="#1A1A1A"
    android:textSize="@dimen/px_28"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/px_30"
    android:text="@string/mine_certify_select" />

   <TextView
    android:layout_centerVertical="true"
    android:layout_toRightOf="@+id/tv"
    android:textColor="#1A1A1A"
    android:textSize="@dimen/px_28"
    android:id="@+id/tv_select_num"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/px_18"
    android:text="0" />

   <Button
    android:textColor="@color/color_b7b8bd"
    android:textSize="@dimen/px_28"
    android:layout_centerVertical="true"
    android:background="@drawable/button__noclickable_shape"
    android:gravity="center"
    android:id="@+id/btn_delete"
    android:layout_width="@dimen/px_160"
    android:layout_height="@dimen/px_66"
    android:layout_marginRight="@dimen/px_30"
    android:layout_alignParentRight="true"
    android:text="删除" />

   <TextView
    android:layout_centerVertical="true"
    android:id="@+id/select_all"
    android:layout_marginRight="@dimen/px_30"
    android:background="@drawable/bg_selete_all"
    android:layout_toLeftOf="@+id/btn_delete"
    android:layout_width="@dimen/px_160"
    android:layout_height="@dimen/px_66"
    android:text="全选"
    android:gravity="center"
    android:textColor="#000001"
    android:textSize="@dimen/px_28"/>

  </RelativeLayout>
 </LinearLayout>

Adapter中的布局就不必再写了,就一个item,最左边一个imageview.

  <ImageView
   android:id="@+id/check_box"
   android:src="@mipmap/ic_uncheck"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical"
   android:layout_marginLeft="@dimen/px_24"
   android:gravity="center"
   android:visibility="gone"/>

布局写完开始写逻辑代码

首先在adapter定义一个方法,以便在activity中拿到数据添加进adapter中

 public void notifyAdapter(List<MyLiveList.MyLive> myLiveList,boolean isAdd){
  if (!isAdd){
   this.mMyLiveList=myLiveList;
  }else {
   this.mMyLiveList.addAll(myLiveList);
  }
  notifyDataSetChanged();
 }

然后在activity中拿到获取到数据后调用adapter中的这个方法,添加数据

 mAdapter.notifyAdapter(data.getList(), false);

在adapter中在判空,更有保证

 public List<MyLiveList.MyLive> getMyLiveList(){
  if (mMyLiveList == null) {
   mMyLiveList =new ArrayList<>();
  }
  return mMyLiveList;
 }

然后adapter中的getItemCount就直接拿到上面这个mMyLiveList的大小就可以了

接下来开始点击编辑的时候显示出imageview和recycleview中的底部全选反选部分

定义两个变量

 private static final int MYLIVE_MODE_CHECK = 0;
 private static final int MYLIVE_MODE_EDIT = 1;

//点击编辑的时候显示,顺便调mAdapter.setEditMode(mEditMode);赋值
 mEditMode = mEditMode == MYLIVE_MODE_CHECK ? MYLIVE_MODE_EDIT : MYLIVE_MODE_CHECK;
  if (mEditMode == MYLIVE_MODE_EDIT) {
   activity_btn.setText("取消");
   ll_mycollection_bottom_dialog.setVisibility(View.VISIBLE);
   editorStatus = true;
  } else {
   activity_btn.setText("编辑");
   ll_mycollection_bottom_dialog.setVisibility(View.GONE);
   editorStatus = false;
   onRefresh();
  }
  mAdapter.setEditMode(mEditMode);

//当然,adapter中也有先关的变量在记录
 private static final int MYLIVE_MODE_CHECK = 0;
 int mEditMode = MYLIVE_MODE_CHECK;

 public void setEditMode(int editMode) {
  mEditMode = editMode;
  notifyDataSetChanged();
 }
//在onBindViewHolder中做显示和隐藏的操作.

 holder.setIsRecyclable(false); // 为了条目不复用

//显示和隐藏
  if (mEditMode == MYLIVE_MODE_CHECK) {
   holder.mCheckBox.setVisibility(View.GONE);
  } else {
   holder.mCheckBox.setVisibility(View.VISIBLE);

为了方便记录选中的状态,在bean里面用个变量记起来

 public boolean isSelect;
  public boolean isSelect() {
   return isSelect;
  }
  public void setSelect(boolean isSelect) {
   this.isSelect = isSelect;
  }
//然后点击条目选中和不选中的时候为Imageview设置不同的图片
   if(myLive.isSelect()) {
    holder.mCheckBox.setImageResource(R.mipmap.ic_checked);
   }else{
    holder.mCheckBox.setImageResource(R.mipmap.ic_uncheck);
   }

//在adapter中暴漏一个Item的点击事件的接口
 public interface OnSwipeListener {
  void onItemClickListener(int pos,List<MyLiveList.MyLive> myLiveList);
 }

/* 
在activity中的item点击事件中,来操作Imageview是否选中 
*/

//用一个变量记录
 private int index = 0;

 MyLive myLive = myLiveList.get(pos);
   boolean isSelect = myLive.isSelect();
   if (!isSelect) {
    index++;
    myLive.setSelect(true);
    if (index == myLiveList.size()) {
     isSelectAll = true;
     selectAll.setText("取消全选");
    }

   } else {
    myLive.setSelect(false);
    index--;
    isSelectAll = false;
    selectAll.setText("全选");
   }
   setBtnBackground(index);
   tv_select_num.setText(String.valueOf(index));
   radioAdapter.notifyDataSetChanged();
 /**
  * 根据选择的数量是否为0来判断按钮的是否可点击.
  *
  * @param size
  */
 private void setBtnBackground(int size) {
  if (size != 0) {
   mBtnDelete.setBackgroundResource(R.drawable.button_shape);
   mBtnDelete.setEnabled(true);
   mBtnDelete.setTextColor(Color.WHITE);
  } else {
   mBtnDelete.setBackgroundResource(R.drawable.button__noclickable_shape);
   mBtnDelete.setEnabled(false);
   mBtnDelete.setTextColor(ContextCompat.getColor(this, R.color.color_b7b8bd));
  }
 }

至于全选和反选的操作,就是遍历这个bean类,得到他的选择状态,重新设置就可以了.

 if (radioAdapter == null) return;
  if (!isSelectAll) {
   for (int i = 0, j = radioAdapter.getMyLiveList().size(); i < j; i++) {
    radioAdapter.getMyLiveList().get(i).setSelect(true);
   }
   index = radioAdapter.getMyLiveList().size();
   mBtnDelete.setEnabled(true);
   selectAll.setText("取消全选");
   isSelectAll = true;
  } else {
   for (int i = 0, j = radioAdapter.getMyLiveList().size(); i < j; i++) {
    radioAdapter.getMyLiveList().get(i).setSelect(false);
   }
   index = 0;
   mBtnDelete.setEnabled(false);
   selectAll.setText("全选");
   isSelectAll = false;
  }
  radioAdapter.notifyDataSetChanged();
  setBtnBackground(index);
  tv_select_num.setText(String.valueOf(index));

最后删除的话就调删除的接口,遍历这个bean,判断当前的状态如果是选中的状态,就删除! 这样就OK了 !!!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Recyclerview多选  # 单选  # 全选  # Recyclerview批量删除  # Android实现弹出列表、单选、多选框  # Android ExpandableListView单选以及多选实现代码  # Android ListView实现单选及多选等功能示例  # Android自定义单选多选下拉列表的实例代码  # Android使用AlertDialog实现的信息列表单选、多选对话框功能  # Android中ListView + CheckBox实现单选、多选效果  # Android实现单选与多选对话框的代码  # Android ListView构建支持单选和多选的投票项目  # Android中创建对话框(确定取消对话框、单选对话框、多选对话框)实例代码  # Android单选多选按钮的使用方法  # 遍历  # 就可以  # 的是  # 也有  # 更有  # 来做  # 两张  # 写完  # 大家多多  # 多选  # 中做  # 复用  # 再写  # 事件中  # textSize  # A1A1A  # text  # layout_toRightOf 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  ,交易猫的商品怎么发布到网站上去?  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  如何在万网利用已有域名快速建站?  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  如何在新浪SAE免费搭建个人博客?  历史网站制作软件,华为如何找回被删除的网站?  如何构建满足综合性能需求的优质建站方案?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  如何用搬瓦工VPS快速搭建个人网站?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  jQuery中的100个技巧汇总  Laravel如何使用Collections进行数据处理?(实用方法示例)  什么是javascript作用域_全局和局部作用域有什么区别?  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何快速搭建高效可靠的建站解决方案?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  高端建站三要素:定制模板、企业官网与响应式设计优化  百度浏览器如何管理插件 百度浏览器插件管理方法  EditPlus中的正则表达式 实战(2)  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  jQuery 常见小例汇总  Python制作简易注册登录系统  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  android nfc常用标签读取总结  如何用AWS免费套餐快速搭建高效网站?  javascript中对象的定义、使用以及对象和原型链操作小结  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  ,南京靠谱的征婚网站?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  iOS验证手机号的正则表达式  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel storage目录权限问题_Laravel文件写入权限设置  怎么用AI帮你为初创公司进行市场定位分析?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  常州企业网站制作公司,全国继续教育网怎么登录?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  如何在云指建站中生成FTP站点?  如何快速搭建高效香港服务器网站?  如何快速完成中国万网建站详细流程?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel如何实现API资源集合?(Resource Collection教程)  JS碰撞运动实现方法详解