服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android中ListView结合CheckBox实现数据批量选择(全选、反选、全不选)

Android中ListView结合CheckBox实现数据批量选择(全选、反选、全不选)

2021-05-06 15:13无缘公子 Android

这篇文章主要介绍了Android编程中ListView结合CheckBox实现批量选择,包括实现全选、反选、全不选等操作,感兴趣的小伙伴们可以参考一下

app的开发中,会常遇到这样的需求:批量取消(删除)list中的数据。这就要求listview支持批量选择、全选、单选等等功能,做一个比较强大的listview批量选择功能是很有必要的,那如何做呢?
可想而知,要支持批量选择,那checkbox的使用是不可或缺的,下面,就使用listview结合checkbox实现数据的批量选择。
先看下效果图,有图有真相:

Android中ListView结合CheckBox实现数据批量选择(全选、反选、全不选)

先说明接下来要实现的listview+checkbox支持的功能:

  •     1.  外部点击“编辑”(长按listview的某一项也可),出现复选框;
  •     2.  支持全选、复选、全不选
  •     3.  支持获取选中的数据的信息

接下来,带大家看下实现的步骤:
1.  定义list_item_data.xml,列表的内容显示,要求其中含有checkbox

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:background="#ffffff"
 android:orientation="horizontal">
 
 <linearlayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_vertical"
  android:gravity="center_vertical"
  android:orientation="horizontal">
 
  <checkbox
   android:id="@+id/checkbox_operate_data"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical"
   android:layout_margin="6dp"
   android:visibility="gone" />
 
  <imageview
   android:id="@+id/material_item_img"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical"
   android:adjustviewbounds="true"
   android:scaletype="centercrop"
   android:src="@mipmap/ic_launcher" />
 
 
 </linearlayout>
 
 
 <linearlayout
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="center_vertical"
  android:orientation="horizontal"
  android:paddingbottom="10dp"
  android:paddingtop="10dp">
 
  <view
   android:id="@+id/user_head_img"
   android:layout_width="5dp"
   android:layout_height="fill_parent"
   android:background="#4483c9" />
 
  <linearlayout
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:orientation="vertical">
 
   <textview
    android:id="@+id/text_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:singleline="true"
    android:text="标题"
    android:textcolor="#555555"
    android:textsize="16sp" />
 
   <linearlayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margintop="10dp"
    android:gravity="center_vertical"
    android:orientation="horizontal">
 
    <textview
     android:id="@+id/text_desc"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_gravity="center_vertical"
     android:gravity="bottom"
     android:singleline="true"
     android:text="描述描述描述描述描述描述"
     android:textcolor="#aaaaaa"
     android:textsize="14sp" />
 
   </linearlayout>
  </linearlayout>
 </linearlayout>
 
</linearlayout>

2.  定义数据显示的bean

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class databean {
 
 public string id;
 
 public string title;
 
 public string desc;
 
 public boolean ischeck;
 
 public databean(string id, string title, string desc) {
  this.id = id;
  this.title = title;
  this.desc = desc;
 }
}

注:databean中含有ischeck属性,该属性主要标志checkbox是否选中。
3.  定义数据显示的adapter,在该adapter中,我们需要实现两个重要的功能:控制是否显示checkbox; 控制checkbox是否显示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import android.content.context;
import android.view.layoutinflater;
import android.view.view;
import android.view.viewgroup;
import android.widget.baseadapter;
import android.widget.checkbox;
import android.widget.textview;
 
import java.util.list;
 
 
public class myadapter extends baseadapter {
 
 private context mcontext;
 
 private list<databean> mdatas;
 
 private layoutinflater minflater;
 
 public boolean flage = false;
 
 
 
 public myadapter(context mcontext, list<databean> mdatas) {
  this.mcontext = mcontext;
  this.mdatas = mdatas;
 
  minflater = layoutinflater.from(this.mcontext);
 
 }
 
 @override
 public int getcount() {
  return mdatas.size();
 }
 
 @override
 public object getitem(int i) {
  return mdatas.get(i);
 }
 
 @override
 public long getitemid(int i) {
  return i;
 }
 
 @override
 public view getview(int position, view convertview, viewgroup viewgroup) {
 
  viewholder holder = null;
 
  if (convertview == null) {
   // 下拉项布局
   convertview = minflater.inflate(r.layout.list_item_data, null);
 
   holder = new viewholder();
 
   holder.checkboxoperatedata = (checkbox) convertview.findviewbyid(r.id.checkbox_operate_data);
   holder.texttitle = (textview) convertview.findviewbyid(r.id.text_title);
   holder.textdesc = (textview) convertview.findviewbyid(r.id.text_desc);
 
   convertview.settag(holder);
 
  } else {
 
   holder = (viewholder) convertview.gettag();
  }
 
  final databean databean = mdatas.get(position);
  if (databean != null) {
   holder.texttitle.settext(databean.title);
   holder.textdesc.settext(databean.desc);
 
 
   // 根据isselected来设置checkbox的显示状况
   if (flage) {
    holder.checkboxoperatedata.setvisibility(view.visible);
   } else {
    holder.checkboxoperatedata.setvisibility(view.gone);
   }
 
   holder.checkboxoperatedata.setchecked(databean.ischeck);
 
   //注意这里设置的不是oncheckedchanglistener,还是值得思考一下的
   holder.checkboxoperatedata.setonclicklistener(new view.onclicklistener() {
    @override
    public void onclick(view v) {
     if (databean.ischeck) {
      databean.ischeck = false;
     } else {
      databean.ischeck = true;
     }
    }
   });
  }
  return convertview;
 }
 
 class viewholder {
 
  public checkbox checkboxoperatedata;
 
  public textview texttitle;
 
  public textview textdesc;
 }
}

注1: flage 字段,用于标志是否显示checkbox,通过在activity中改变该值,即可在getview方法中控制是否显示checkbox。
注2: 定义checkbox的setonclicklistener方法,而不是oncheckedchanglistener,如此使用,可方便控制checkbox是否选中。
4. 定义activity

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
public class mainactivity extends activity {
 
 private button button;
 
 private listview listview;
 
 private list<databean> mdatas;
 
 private myadapter madapter;
 
 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);
  button = (button) findviewbyid(r.id.button);
  listview = (listview) findviewbyid(r.id.listview);
 
  mdatas = new arraylist<>();
  for (int i = 0; i < 20; i++) {
 
   databean databean = new databean("" + i, "上邪", "山无棱,天地合,乃敢与君绝");
   mdatas.add(databean);
  }
 
  madapter = new myadapter(this, mdatas);
  listview.setadapter(madapter);
 
 }
 
 /**
  * 编辑、取消编辑
  * @param view
  */
 public void btneditlist(view view) {
 
  madapter.flage = !madapter.flage;
 
  if (madapter.flage) {
   button.settext("取消");
  } else {
   button.settext("编辑");
  }
 
  madapter.notifydatasetchanged();
 }
 
 /**
  * 全选
  * @param view
  */
 public void btnselectalllist(view view) {
  if (madapter.flage) {
   for (int i = 0; i < mdatas.size(); i++) {
    mdatas.get(i).ischeck = true;
   }
 
   madapter.notifydatasetchanged();
  }
 }
 
 /**
  * 全不选
  * @param view
  */
 public void btnnolist(view view) {
 
  if (madapter.flage) {
   for (int i = 0; i < mdatas.size(); i++) {
    mdatas.get(i).ischeck = false;
   }
 
   madapter.notifydatasetchanged();
  }
 }
 
 /**
  * 反选
  * @param view
  */
 public void btnfanxuanlist(view view) {
  if (madapter.flage) {
   for (int i = 0; i < mdatas.size(); i++) {
    if (mdatas.get(i).ischeck) {
     mdatas.get(i).ischeck = false;
    } else {
     mdatas.get(i).ischeck = true;
    }
   }
 
   madapter.notifydatasetchanged();
  }
 }
 
 /**
  * 获取选中数据
  * @param view
  */
 public void btnoperatelist(view view) {
 
  list<string> ids = new arraylist<>();
 
  if (madapter.flage) {
 
   for (int i = 0; i < mdatas.size(); i++) {
    if (mdatas.get(i).ischeck) {
     ids.add(mdatas.get(i).id);
    }
   }
 
   toast.maketext(mainactivity.this,ids.tostring(), toast.length_short).show();
   log.e("tag", ids.tostring());
  }
 }
}

如此这般,完美的可批量选择的listview便实现了,希望大家喜欢。

延伸 · 阅读

精彩推荐