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应用程序运行原理 ...
随机推荐
- vi/vim基本使用方法(转)
转自:http://www.cnblogs.com/itech/archive/2009/04/17/1438439.html vi/vim 基本使用方法 本文介绍了vi (vim)的基本使用方法,但 ...
- 不用的代码,存一份--用tornado实现的websocket
因为现在使用Channels来实现啦, 这样就在Django的体系里自已弄完了. 方便后期代码维护和服务器部署. 这份土陋的东东,就放起来吧. 毕竟,通过读取文件来返回实时websocket,不适应于 ...
- CentOS7.5之Sqoop1.4.7的安装使用
一 Sqoop简介 Apache Sqoop(TM) 于 2012 年 3 月孵化出来,现在是一个顶级的 Apache 项目.是一种旨在有效地在 Apache Hadoop 和诸如关系数据库等结构化数 ...
- Oracle学习笔记——点滴汇总
Oracle学习笔记——点滴汇总 http://www.botangdb.com/ Oracle GI = Grid Infrastructure = ASM + Cluster
- POJ - 1743 后缀自动机
POJ - 1743 顺着原字符串找到所有叶子节点,然后自下而上更新,每个节点right的最左和最右,然后求出答案. #include<cstdio> #include<cstrin ...
- GTK, GTK+, Qt, KDE, GNOME, Unity的区别与联系
GTK,GTK+, Qt是图形界面开发库(GUI Toolkit),用户可以使用这些开发库编写GUI应用,其中GTK+是GTK的升级版. KDE,GNOME,Unity是linux下的桌面环境(Des ...
- Stringbuilder & Stringbuffer
StringBuilder和StringBuffer的父类都是继承了 AbstractStringBuilder, 他们各自的append方法都是调用了 super.append(str), 但是一个 ...
- Python使用正则
Python中使用正则的两种方式 在Python中有两只能够使用正则表达式的方式: 直接使用re模块中的函数 import re re_string = "{{(.*?)}}" s ...
- Linux内核中断处理机制
<什么是中断> 计算停下当前处理任务,并保存现场,转而去处理其他是任务,当完成任务后再回到原来的任务中去. <中断的分类> a:软中断 软中断时执行中断指令产生的,软中 ...
- 概率论中常见分布总结以及python的scipy库使用:两点分布、二项分布、几何分布、泊松分布、均匀分布、指数分布、正态分布
概率分布有两种类型:离散(discrete)概率分布和连续(continuous)概率分布. 离散概率分布也称为概率质量函数(probability mass function).离散概率分布的例子有 ...