Android开发之ListView条目批量选择删除
ListView实现的列表,假设是可编辑,可删除的,一般都要提供批量删除功能,否则的话,一项一项的删除体验非常不好,也给用户带来了非常大的麻烦。
实现效果图
详细实现代码
select.xml
主布局文件包括一个ListView另一个隐藏的布局,包括了两个Button一个TextView,默认布局为gone,当监听到长按响应事件时候显示。
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical" >
6
7 <ListView
8
9 android:id="@+id/list"
10 android:layout_width="match_parent"
11 android:layout_height="match_parent"
12 android:layout_weight="1"
13 android:cacheColorHint="#FFF" >
14
15 </ListView>
16
17 <RelativeLayout
18
19 android:id="@+id/relative"
20 android:layout_width="fill_parent"
21 android:layout_height="50dp"
22 android:gravity="bottom"
23 android:background="@color/lemonchiffon"
24 android:visibility="gone"
25 >
26 <Button
27
28 android:id="@+id/cancle"
29 android:layout_width="wrap_content"
30 android:layout_height="wrap_content"
31 android:text="撤销 |"
32 android:textSize="20sp"
33 android:background="@null"
34 android:layout_centerVertical="true"
35
36 />
37 <TextView
38
39 android:id="@+id/txtcount"
40 android:layout_width="wrap_content"
41 android:layout_height="wrap_content"
42 android:text="共计"
43 android:textSize="15sp"
44 android:layout_centerInParent="true"
45
46 />
47
48 <Button
49
50 android:id="@+id/delete"
51 android:layout_width="wrap_content"
52 android:layout_height="wrap_content"
53 android:text="| 删除"
54 android:textSize="20sp"
55 android:background="@null"
56 android:layout_alignParentRight="true"
57 android:layout_centerVertical="true"
58 />
59
60
61 </RelativeLayout>
62 </LinearLayout>
item.xml
包括一个TextView 一个CheckBox
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="horizontal" >
6
7 <TextView
8 android:id="@+id/txtName"
9 android:layout_width="match_parent"
10 android:layout_height="wrap_content"
11 android:layout_alignParentLeft="true"
12 android:layout_centerVertical="true"
13 android:layout_gravity="center_vertical"
14 android:layout_marginLeft="5dp"
15 android:layout_weight="1"
16 android:text="444444444444"
17 android:textSize="17sp"
18 android:textColor="#333" />
19
20 <CheckBox
21 android:id="@+id/check"
22 android:layout_width="wrap_content"
23 android:layout_height="wrap_content"
24 android:visibility="gone"
25 android:clickable="false"
26 />
27 </LinearLayout>
通过自己定义Adapter绑定ListView数据源,实现长按监听,在长按监听时候,切记将监听事件返回ture。
1 /**
2 * @author ieasy360_1
3 * 自己定义Adapter
4 */
5 class Adapter extends BaseAdapter{
6 private Context context;
7 private LayoutInflater inflater=null;
8 private HashMap<Integer, View> mView ;
9 public HashMap<Integer, Integer> visiblecheck ;//用来记录是否显示checkBox
10 public HashMap<Integer, Boolean> ischeck;
11 private TextView txtcount;
12 public Adapter(Context context,TextView txtcount)
13 {
14 this.context = context;
15 this.txtcount = txtcount;
16 inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
17 mView = new HashMap<Integer, View>();
18 visiblecheck = new HashMap<Integer, Integer>();
19 ischeck = new HashMap<Integer, Boolean>();
20 if(isMulChoice){
21 for(int i=0;i<array.size();i++){
22 ischeck.put(i, false);
23 visiblecheck.put(i, CheckBox.VISIBLE);
24 }
25 }else{
26 for(int i=0;i<array.size();i++)
27 {
28 ischeck.put(i, false);
29 visiblecheck.put(i, CheckBox.INVISIBLE);
30 }
31 }
32 }
33
34 public int getCount() {
35 // TODO Auto-generated method stub
36 return array.size();
37 }
38
39 public Object getItem(int position) {
40 // TODO Auto-generated method stub
41 return array.get(position);
42 }
43
44 public long getItemId(int position) {
45 // TODO Auto-generated method stub
46 return 0;
47 }
48
49 public View getView(final int position, View convertView, ViewGroup parent) {
50 // TODO Auto-generated method stub
51 View view = mView.get(position);
52 if(view==null)
53 {
54 view = inflater.inflate(R.layout.item, null);
55 TextView txt = (TextView)view.findViewById(R.id.txtName);
56 final CheckBox ceb = (CheckBox)view.findViewById(R.id.check);
57
58 txt.setText(array.get(position));
59
60 ceb.setChecked(ischeck.get(position));
61 ceb.setVisibility(visiblecheck.get(position));
62
63 view.setOnLongClickListener(new Onlongclick());
64
65 view.setOnClickListener(new OnClickListener() {
66
67 public void onClick(View v) {
68 // TODO Auto-generated method stub
69 if(isMulChoice){
70 if(ceb.isChecked()){
71 ceb.setChecked(false);
72 selectid.remove(array.get(position));
73 }else{
74 ceb.setChecked(true);
75 selectid.add(array.get(position));
76 }
77 txtcount.setText("共选择了"+selectid.size()+"项");
78 }else {
79 Toast.makeText(context, "点击了"+array.get(position), Toast.LENGTH_LONG).show();
80 }
81 }
82 });
83
84 mView.put(position, view);
85 }
86 return view;
87 }
88
89 class Onlongclick implements OnLongClickListener{
90
91 public boolean onLongClick(View v) {
92 // TODO Auto-generated method stub
93
94 isMulChoice = true;
95 selectid.clear();
96 layout.setVisibility(View.VISIBLE);
97 for(int i=0;i<array.size();i++)
98 {
99 adapter.visiblecheck.put(i, CheckBox.VISIBLE);
100 }
101 adapter = new Adapter(context,txtcount);
102 listview.setAdapter(adapter);
103 return true;
104 }
105 }
106 }
所有实现代码
1 package com.example.test;
2 import java.util.ArrayList;
3 import java.util.HashMap;
4 import java.util.List;
5 import android.app.Activity;
6 import android.content.Context;
7 import android.os.Bundle;
8 import android.view.ContextMenu;
9 import android.view.ContextMenu.ContextMenuInfo;
10 import android.view.LayoutInflater;
11 import android.view.View;
12 import android.view.View.OnClickListener;
13 import android.view.View.OnLongClickListener;
14 import android.view.ViewGroup;
15 import android.widget.BaseAdapter;
16 import android.widget.Button;
17 import android.widget.CheckBox;
18 import android.widget.ListView;
19 import android.widget.RelativeLayout;
20 import android.widget.TextView;
21 import android.widget.Toast;
22
23 /**
24 * @author ieasy360_1
25 *
26 */
27 public class MulSelect extends Activity implements OnClickListener {
28
29 private ListView listview;
30 private Context context;
31 private List<String> array = new ArrayList<String>();
32 private List<String> selectid = new ArrayList<String>();
33 private boolean isMulChoice = false; //是否多选
34 private Adapter adapter;
35 private RelativeLayout layout;
36 private Button cancle,delete;
37 private TextView txtcount;
38
39 @Override
40 protected void onCreate(Bundle savedInstanceState) {
41 // TODO Auto-generated method stub
42 super.onCreate(savedInstanceState);
43 setContentView(R.layout.select);
44 context = this;
45 listview = (ListView)findViewById(R.id.list);
46 layout = (RelativeLayout)findViewById(R.id.relative);
47 txtcount = (TextView)findViewById(R.id.txtcount);
48 cancle = (Button)findViewById(R.id.cancle);
49 delete = (Button)findViewById(R.id.delete);
50 cancle.setOnClickListener(this);
51 delete.setOnClickListener(this);
52 init();
53 adapter = new Adapter(context,txtcount);
54 listview.setAdapter(adapter);
55
56 }
57
58 void init()
59 {
60 for(int i=0;i<20;i++)
61 {
62 array.add("小明"+i);
63 }
64 }
65
66 public void onClick(View v) {
67 // TODO Auto-generated method stub
68 switch (v.getId()) {
69 case R.id.cancle:
70 isMulChoice = false;
71 selectid.clear();
72 adapter = new Adapter(context,txtcount);
73 listview.setAdapter(adapter);
74 layout.setVisibility(View.INVISIBLE);
75 break;
76 case R.id.delete:
77 isMulChoice =false;
78 for(int i=0;i<selectid.size();i++){
79 for(int j=0;j<array.size();j++){
80 if(selectid.get(i).equals(array.get(j))){
81 array.remove(j);
82 }
83 }
84 }
85 selectid.clear();
86 adapter = new Adapter(context,txtcount);
87 listview.setAdapter(adapter);
88 layout.setVisibility(View.INVISIBLE);
89 break;
90 default:
91 break;
92 }
93
94 }
95
96 @Override
97 public void onCreateContextMenu(ContextMenu menu, View v,
98 ContextMenuInfo menuInfo) {
99 // TODO Auto-generated method stub
100 super.onCreateContextMenu(menu, v, menuInfo);
101 menu.setHeaderTitle("操作");
102 }
103
104 /**
105 * @author ieasy360_1
106 * 自己定义Adapter
107 */
108 class Adapter extends BaseAdapter{
109 private Context context;
110 private LayoutInflater inflater=null;
111 private HashMap<Integer, View> mView ;
112 public HashMap<Integer, Integer> visiblecheck ;//用来记录是否显示checkBox
113 public HashMap<Integer, Boolean> ischeck;
114 private TextView txtcount;
115 public Adapter(Context context,TextView txtcount)
116 {
117 this.context = context;
118 this.txtcount = txtcount;
119 inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
120 mView = new HashMap<Integer, View>();
121 visiblecheck = new HashMap<Integer, Integer>();
122 ischeck = new HashMap<Integer, Boolean>();
123 if(isMulChoice){
124 for(int i=0;i<array.size();i++){
125 ischeck.put(i, false);
126 visiblecheck.put(i, CheckBox.VISIBLE);
127 }
128 }else{
129 for(int i=0;i<array.size();i++)
130 {
131 ischeck.put(i, false);
132 visiblecheck.put(i, CheckBox.INVISIBLE);
133 }
134 }
135 }
136
137 public int getCount() {
138 // TODO Auto-generated method stub
139 return array.size();
140 }
141
142 public Object getItem(int position) {
143 // TODO Auto-generated method stub
144 return array.get(position);
145 }
146
147 public long getItemId(int position) {
148 // TODO Auto-generated method stub
149 return 0;
150 }
151
152 public View getView(final int position, View convertView, ViewGroup parent) {
153 // TODO Auto-generated method stub
154 View view = mView.get(position);
155 if(view==null)
156 {
157 view = inflater.inflate(R.layout.item, null);
158 TextView txt = (TextView)view.findViewById(R.id.txtName);
159 final CheckBox ceb = (CheckBox)view.findViewById(R.id.check);
160
161 txt.setText(array.get(position));
162
163 ceb.setChecked(ischeck.get(position));
164 ceb.setVisibility(visiblecheck.get(position));
165
166 view.setOnLongClickListener(new Onlongclick());
167
168 view.setOnClickListener(new OnClickListener() {
169
170 public void onClick(View v) {
171 // TODO Auto-generated method stub
172 if(isMulChoice){
173 if(ceb.isChecked()){
174 ceb.setChecked(false);
175 selectid.remove(array.get(position));
176 }else{
177 ceb.setChecked(true);
178 selectid.add(array.get(position));
179 }
180 txtcount.setText("共选择了"+selectid.size()+"项");
181 }else {
182 Toast.makeText(context, "点击了"+array.get(position), Toast.LENGTH_LONG).show();
183 }
184 }
185 });
186
187 mView.put(position, view);
188 }
189 return view;
190 }
191
192 class Onlongclick implements OnLongClickListener{
193
194 public boolean onLongClick(View v) {
195 // TODO Auto-generated method stub
196
197 isMulChoice = true;
198 selectid.clear();
199 layout.setVisibility(View.VISIBLE);
200 for(int i=0;i<array.size();i++)
201 {
202 adapter.visiblecheck.put(i, CheckBox.VISIBLE);
203 }
204 adapter = new Adapter(context,txtcount);
205 listview.setAdapter(adapter);
206 return true;
207 }
208 }
209 }
210 }
Android开发之ListView条目批量选择删除的更多相关文章
- 【转】Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法
Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法 [原文链接] 这篇文章完美的解决了我几个月没结论的bug... 感谢热爱分享的技术达人~ 我是怎么走进这个大坑的 ...
- Android开发之ListView实现不同品种分类分隔栏的效果(非ExpandableListView实现)
我们有时候会遇到这么一个情况.就是我在一个ListView里面须要显示的东西事实上是有种类之分的.比方我要分冬天,夏天.秋天.春天,然后在这每一个季节以下再去载入各自的条目数据. 还有,比方我们的通讯 ...
- android 开发之 ListView 与Adapter 应用实践
在开发android中,ListView 的应用显得非常频繁,只要需要显示列表展示的应用,可以说是必不可少,下面是记录开发中应用到ListView与Adapter 使用的实例: ListView 所在 ...
- Android开发之ListView添加多种布局效果演示
在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断 ...
- Android开发之ListView设置隔行变色
public class HLCheckAdapter extends BaseAdapter { private List<HuoLiang> list; private Context ...
- Android开发之ListView详解 以及简单的listView优化
ListView列表视图 最常用的控件之一,使用场景例如:微信,手机QQ等等. android:divider:每个item之间的分割线,可以使用图片或者色值. android:dividerHeig ...
- android开发之 listview中的item去掉分割线 隐藏分割线
有三种方法: 1> 设置android:divider="@null" 2> android:divider="#00000000" #000000 ...
- Android开发之AlertDialog警告提示框删除与取消 详解代码
package cc.jiusansec.www; import android.app.Activity; import android.app.AlertDialog; import androi ...
- 【Android UI】Android开发之View的几种布局方式及实践
引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...
随机推荐
- servlet 学习笔记(二)
---------------------第二讲--------------------------------- 开发servlet有三种方法: 1.实现servlet接口(最原始的) 实现接口的5 ...
- SQL 根据生日和日期计算年龄
FLOOR(datediff(DY,p.Dob,o.RegisterTime)/365
- Zabbix的通知功能以及自定义脚本告警
本节内容: Zabbix的通知功能 定义接收告警的用户 定义Action Zabbix自定义脚本发送报警邮件 一.Zabbix的通知功能 在配置好监控项和触发器之后,一旦正常工作中的某触发器状态发生改 ...
- TypeScript学习笔记(四) - 类和接口
本篇将介绍TypeScript里的类和接口. 与其他强类型语言类似,TypeScript遵循ECMAScript 2015标准,支持class类型,同时也增加支持interface类型. 一.类(cl ...
- 【LOJ】#2027. 「SHOI2016」黑暗前的幻想乡
题解 我一开始写的最小表示法写的插头dp,愉快地TLE成60分 然后我觉得我就去看正解了! 发现是容斥 + 矩阵树定理 矩阵树定理对于有重边的图只要邻接矩阵的边数设置a[u][v]表示u,v之间有几条 ...
- 跑对抗样本库 CleverHans 的例子时,遇到的问题
环境:Ubuntu+TensorFlow 首先是GPU被其他人占用了,怎么也跑不起来最简单的TensorFlow小例子. 所以先学会如何查看显卡使用情况,转去使用其他空闲显卡. Linux查看Nvid ...
- 那些年我们爬过的山 - mybatis批量导入
[原创作品,转载请注明出处] 写这篇文章之前想着给这篇博客起一个文艺一点的标题,思来想去,想到了那些年我们爬过的山,或者我们一起趟过的河?代码不规范,同事两行泪,这是多么痛的领悟啊! 背景 本组一名实 ...
- mysql正则表达式,实现多个字段匹配多个like模糊查询
现在有这么一个需求 一个questions表,字段有题目(TestSubject),选项(AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) 要求字段不包含png,jpg ...
- C++ 几种经典的垃圾回收算法
之前遇到了一篇好文(https://blog.csdn.net/wallwind/article/details/6889917)准备学习一下的,课程繁忙就忘记了,今日得闲,特来补一下. 自己写一遍加 ...
- “通用类型系统”(CTS)
一.什么是“通用类型系统”(CTS) 描述类型的定义和行为 二.CTS规范 一个类型可以包含零个或者多个成员1,成员①字段(Field)作为对象状态一部分的数据变量.字段根据名称和类型来区分②方法(M ...