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条目批量选择删除的更多相关文章

  1. 【转】Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法

    Android开发之ListView+EditText-要命的焦点和软键盘问题解决办法 [原文链接] 这篇文章完美的解决了我几个月没结论的bug... 感谢热爱分享的技术达人~ 我是怎么走进这个大坑的 ...

  2. Android开发之ListView实现不同品种分类分隔栏的效果(非ExpandableListView实现)

    我们有时候会遇到这么一个情况.就是我在一个ListView里面须要显示的东西事实上是有种类之分的.比方我要分冬天,夏天.秋天.春天,然后在这每一个季节以下再去载入各自的条目数据. 还有,比方我们的通讯 ...

  3. android 开发之 ListView 与Adapter 应用实践

    在开发android中,ListView 的应用显得非常频繁,只要需要显示列表展示的应用,可以说是必不可少,下面是记录开发中应用到ListView与Adapter 使用的实例: ListView 所在 ...

  4. Android开发之ListView添加多种布局效果演示

    在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断 ...

  5. Android开发之ListView设置隔行变色

    public class HLCheckAdapter extends BaseAdapter { private List<HuoLiang> list; private Context ...

  6. Android开发之ListView详解 以及简单的listView优化

    ListView列表视图 最常用的控件之一,使用场景例如:微信,手机QQ等等. android:divider:每个item之间的分割线,可以使用图片或者色值. android:dividerHeig ...

  7. android开发之 listview中的item去掉分割线 隐藏分割线

    有三种方法: 1> 设置android:divider="@null" 2> android:divider="#00000000" #000000 ...

  8. Android开发之AlertDialog警告提示框删除与取消 详解代码

    package cc.jiusansec.www; import android.app.Activity; import android.app.AlertDialog; import androi ...

  9. 【Android UI】Android开发之View的几种布局方式及实践

    引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...

随机推荐

  1. 【BZOJ】4671: 异或图

    题解 写完之后开始TTTTTTT--懵逼 这道题我们考虑一个东西叫容斥系数啊>< 这个是什么东西呢 也就是\(\sum_{i = 1}^{m}\binom{m}{i}f_{i} = [m ...

  2. 在windows下的CLI模式下如何运行php文件

    https://blog.csdn.net/evkj2013/article/details/52313728 https://jingyan.baidu.com/article/da1091fb09 ...

  3. web到service简单原理例子

    这是目前的理解 附上服务端源码 package com.lsw.server; import java.io.*; import java.net.*; import java.util.HashMa ...

  4. ES6 一些笔记

    一. let/const: 1. “暂时性死区”概念:在代码块内,使用let/const命令声明变量之前,该变量都是不可用的.这在语法上,称为“暂时性死区”(temporal dead zone,简称 ...

  5. JAVA单向链表实现

    JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...

  6. Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Could not create connection to database server.

    报错信息:Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQL ...

  7. 【Vijos 1998】【SDOI 2016】平凡的骰子

    https://vijos.org/p/1998 三维计算几何. 需要混合积求四面体体积: 四面体剖分后合并带权重心求总重心: 四面体重心的横纵坐标是四个顶点的横纵坐标的平均数: 三维差积求平面的法向 ...

  8. 【持续更新】NOIP注意事项

    1.无根据的乱搞不可能对 2.必须造极限数据跑一下 3.必须测空间 4.不管用不用都把cstring加上 5.开文件测样例 6.删一长串代码最好注释 7.到10:00先敲暴力 8.题读三遍 9.先做好 ...

  9. 【BFS】【最小生成树】Petrozavodsk Winter Training Camp 2018 Day 1: Jagiellonian U Contest, Tuesday, January 30, 2018 Problem G. We Need More Managers!

    题意:给你n个点,点带权,任意两点之间的边权是它们的点权的异或值中“1”的个数,问你该图的最小生成树. 看似是个完全图,实际上有很多边是废的.类似……卡诺图的思想?从读入的点出发BFS,每次只到改变它 ...

  10. shellcode在栈溢出中的利用与优化

    0x00 前言 在<Windows Shellcode学习笔记——shellcode的提取与测试>中介绍了如何对shellcode作初步优化,动态获取Windows API地址并调用,并通 ...