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

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

(0)

相关推荐

  • android中RecyclerView悬浮吸顶效果

    MultiType-Adapter打造悬浮吸顶效果 注:当前版本只适合配合RecyclerView快速打造一款 展示UI 悬浮吸顶效果,如 通讯录效果,由于实现机制的原因,暂时不支持触摸事件. MultiType-Adapter介绍地址:MultiType-Adapter 是一款轻量级支持多数据类型的 RecyclerView 适配器; 使用简单,完全解耦; 悬浮吸顶效果 ```groovy // root build.gradle repositories { jcenter() maven

  • Android中RecyclerView 滑动时图片加载的优化

    RecyclerView 滑动时的优化处理,在滑动时停止加载图片,在滑动停止时开始加载图片,这里用了Glide.pause 和Glide.resume.这里为了避免重复设置增加开销,设置了一个标志变量来做判断. mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, in

  • Android RecyclerView的卡顿问题的解决方法

    RecyclerView为什么会卡 RecyclerView作为v7包的新控件,自从推出就广受Android Developer们欢迎,实际上它已经取代了ListView和GridView两位老前辈的地位.然而不少亲们想必也已经发现了:没有优化过的Recycler性能很poor.上一篇博主使用的item也仅仅是一个图两串字而已,结果一滑动就卡的要命,不能忍! 那么why?回想在用ListView和GridView的adapter时,我们是用一种叫ViewHolder的自定义类(容器)来实现优化的

  • Android嵌套RecyclerView左右滑动替代自定义view

    以前的左右滑动效果采用自定义scrollview或者linearlayout来实现,recyclerview可以很好的做这个功能,一般的需求就是要么一个独立的左右滑动效果,要么在一个列表里的中间部分一个左右滑动效果 而列表里面也容易,只是需要解决一点小问题,个人认为值得一提的就是高度问题,一般的人采用固定死的高度,可是在列表里面展示和机型的不同,固定死的话很难保证美观,动态的高度才能解决问题的所在 首先在一个列表控件布局上添加一个recyclerview控件 <android.support.v

  • Android RecyclerView显示Item布局不一致解决办法

    RecyclerView显示Item布局不一致 在自定义RecyclerAdapter的时候,在重写onCreateViewHolder方法是使用了 @Override public H onCreateViewHolder(ViewGroup parent, int viewType) { View view=View.inflate(context,layoutId,null); return view; } 进行生成布局,结果发现生成的布局没有LayoutParams.以前自定义View的

  • Android中RecyclerView实现多级折叠列表效果(二)

    前言 在本文开始之前请大家先看一下这篇文章:http://www.jb51.net/article/113510.htm 上面的这篇文章是之前写的,里面发现有很多不好用地方,也学到些新姿势,改动了许多地方.下面来看看详细的介绍: 要点: 1.可以通过后台控制Item的展示. 2.TreeRecyclerAdapter,可以展开,折叠.多级展示 3.adapter可以使用装饰者模式进行扩展.支持EmptyAdapter.可以添加headview和footview 4.item的样式可以编写文档,t

  • Android中RecyclerView实现分页滚动的方法详解

    一.需求分析 最近公司项目要实现一个需求要满足以下功能: 1)显示一个 list 列表, item 数量不固定. 2)实现翻页功能,一次翻一页. 3)实现翻至某一页功能. 下面介绍通过 RecyclerView 实现该需求的实现过程(效果图如下). 二.功能实现 2.1 OnTouchListener 记录当前开始滑动位置 要实现翻页滑动首先我们要确定是向前翻页还是向后翻页,这里通过记录开始翻页前当前的位置和滑动后的位置比较即可得知,下面选择手指触摸按下时滑动的位置为当前开始滑动位置: //当前

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

    效果图如下: Recyclerview 实现多选,单选,全选,反选,批量删除的步骤 1.在Recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件 2.这里选中的控件没有用checkbox来做,用的是imageview,选中和不选中其实是两张图片 3.默认是不显示选中的控件的,点击编辑的时候显示,点击取消的时候隐藏 4.通过adapter和activity数据之间的传递,然后进行具体的操作 具体代码如下: 在recyclerview的布局中写全选,反选,删除,计数等相

  • android基于ListView和CheckBox实现多选和全选记录的功能

    应用开发中经常会有从数据库中读取数据显示,然后选中多条.全部记录并且删除的需求.在做定制系统联系人的时候也遇到这样的需求,下面写个简单的通过ListView和CheckBox实现多选.全选的例子.下面是具体的代码. 效果如下: MultiSelectActivity /** * MultiSelectActivity */ public class MultiSelectActivity extends Activity implements OnClickListener, OnItemCli

  • Android中ListView绑定CheckBox实现全选增加和删除功能(DEMO)

    ListView控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adapter的用法,加了很多的判断等等等等-.我们先来看看实现的效果吧! 好的,我们新建一个项目LvCheckBox 我们事先先把这两个布局写好吧,一个是主布局,还有一个listview的item.xml,相信不用多说 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/

  • Android 中使用EditText 点击全选再次点击取消全选功能

    最近在开发浏览器碰到这么一个需求:点击地址栏的时候,需要全选并调出键盘,再次点击就取消全选显示光标.点击屏幕除地址栏其他位置时,键盘隐藏,隐藏光标. 大部分浏览器都是这样的逻辑,这样可以提高用户体验,减少操作. 代码很简单,这里我简化了逻辑,页面只有一个EditText. 布局文件如下:里面有两个属性需要注意 android:focusable="true" android:selectAllOnFocus="true" 完整布局文件 <?xml versio

  • Android实现ListView控件的多选和全选功能实例

    本文实例讲述了Android实现ListView控件的多选和全选功能.分享给大家供大家参考,具体如下: 主程序代码 MainActivity.Java package yy.test; import java.util.ArrayList; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.vi

  • vue+vant-UI框架实现购物车的复选框全选和反选功能

    购物车页面的设计图 商品的列表 代码: <ul v-if="shoppingListData.rows.length"> <li v-for="(item,index) in shoppingListData.rows" :key="index" > <van-checkbox :value="item.goods_id" v-model="item.isChecked" ch

  • 微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能

    实现的效果就是: 1.点击全选选中所有商品,再点击全选,取消勾选 2.在选中的同时获取需要的商品id,获取后是以字符串拼接的形式 拼成一个字符串 3.点击删除按钮时删除选中的商品 点击全选 再次点击全选框 wxml关键代码 重要代码 value="{{item.goods_id}}" -->checkbox被选中的值就是这个goods_id checked="{{item.checked}}" -->checked代表选中与否 ,ture选中,false

  • 微信小程序获取复选框全选反选选中的值(实例代码)

    wxml文件 <view class="tr"> <view class="th"> <checkbox bindtap="selectall" />全选 </view> <view class="th">id</view> <view class="th">名称</view> </view> <

  • JQuery实现列表中复选框全选反选功能封装(推荐)

    我们在做列表的时候经常会遇到全选,反选进行批量处理问题,例如: 我当时就是简单的实现了,然后想封装到公共的js中,封装的太烂,不好意思贴出来了(就是把实现代码之间放到公共js中,然后每个页面都用固定的id,class,现在想想我都不好意思叫他封装了),然后想到之前老大有写过这个功能去看下他怎么写的,真是没有对比就没有伤害啊,这才叫封装: $(':checkbox[data-check-target]').click(function () { var target = $(this).attr(

  • AngularJS 购物车全选/取消全选功能的实现方法

    刚学习angularJS,于是练习写了一个类似于购物车的全选/取消全选的功能,主要实现的功能有: 1.勾选全选checkbox,列表数据全部被勾选,取消同理,用ng-model实现双向绑定: 2.选中列表中的所有checkbox,全选也会被勾选:(这里我想到的方法是给每一个对象增加checked字段,然后勾选触发echoChange()函数,用了一个cc变量计算当前checked为true的个数,然后再判断被勾选个数与数组长度是否相等,相等则证明全部被勾选,于是全选按钮也赋值为true;不知道还

随机推荐