效果图如下:
recyclerview 实现多选,单选,全选,反选,批量删除的步骤
1.在recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件
2.这里选中的控件没有用checkbox来做,用的是imageview,选中和不选中其实是两张图片
3.默认是不显示选中的控件的,点击编辑的时候显示,点击取消的时候隐藏
4.通过adapter和activity数据之间的传递,然后进行具体的操作
具体代码如下:
在recyclerview的布局中写全选,反选,删除,计数等相应的控件
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">
android:background="#e5e5e5"
android:layout_width="match_parent"
android:layout_height="1px"/>
android:background="@color/white"
android:layout_width="match_parent"
android:layout_height="@dimen/px_90">
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" />
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" />
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="删除" />
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"/>
adapter中的布局就不必再写了,就一个item,最左边一个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,boolean isadd){
if (!isadd){
this.mmylivelist=mylivelist;
}else {
this.mmylivelist.addall(mylivelist);
}
notifydatasetchanged();
}
然后在activity中拿到获取到数据后调用adapter中的这个方法,添加数据
madapter.notifyadapter(data.getlist(), false);
在adapter中在判空,更有保证
public list 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);
}
/*
在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了 !!!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。