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

作者:郭_昊 时间:2021-12-10 21:57:24 

效果图如下:

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

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

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

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了 !!!

来源:http://blog.csdn.net/guohaosir/article/details/72403724

标签:Recyclerview,多选,全选
0
投稿

猜你喜欢

  • springboot自定义Starter过程解析

    2023-07-24 22:24:55
  • 三道java新手入门面试题,通往自由的道路--多线程

    2023-05-24 23:12:51
  • Spring Boot @Conditional注解用法示例介绍

    2023-04-18 22:51:51
  • struts中动态方法调用使用通配符

    2023-02-01 02:52:43
  • Java语言实现简单FTP软件 FTP协议分析(1)

    2023-11-10 17:57:21
  • springboot为异步任务规划自定义线程池的实现

    2022-12-05 01:13:02
  • Java计时器StopWatch实现方法代码实例

    2021-07-25 13:43:42
  • Java基于接口实现模拟动物声音代码实例

    2022-07-28 04:46:07
  • Java面试题冲刺第二十六天--实战编程

    2023-05-22 16:01:54
  • 浅析Java多线程同步synchronized

    2023-05-20 15:52:29
  • 一篇文章教会你用Unity制作网格地图生成组件

    2023-09-05 04:44:36
  • Java8实现对List<Integer>的求和

    2023-12-08 07:03:51
  • C#委托用法详解

    2023-06-04 22:46:43
  • springboot使用mybatis开启事务回滚

    2022-09-10 05:15:55
  • 如何将默认的maven仓库改为阿里的maven仓库

    2022-09-30 14:16:31
  • MyBatis数据脱敏的实现方案介绍

    2021-10-06 19:22:34
  • Java编程Nashorn实例代码

    2022-07-30 05:28:21
  • 使用Maven Helper解决Maven插件冲突的方法

    2023-11-08 06:07:05
  • Android 在 res/layout 文件夹 下创建一个 子文件夹实例

    2021-07-31 22:50:21
  • Java Web使用简单的批处理操作(记事本+Tomcat)

    2021-08-13 10:08:33
  • asp之家 软件编程 m.aspxhome.com