Android ListView批量选择(全选、反选、全不选)
2023-09-14 08:56:50 时间
APP的开发中,会常遇到这样的需求:批量取消(删除)List中的数据。这就要求ListVIew支持批量选择、全选、单选等等功能,做一个比较强大的ListView批量选择功能是很有必要的,那如何做呢?
可想而知,要支持批量选择,那CheckBox的使用是不可或缺的,下面,就使用ListView结合CheckBox实现数据的批量选择。
先看下效果图,有图有真相:
先说明接下来要实现的ListView+CheckBox支持的功能:
1. 外部点击“编辑”(长按ListView的某一项也可),出现复选框;
2. 支持全选、复选、全不选
3. 支持获取选中的数据的信息
接下来,带大家看下实现的步骤:
1. 定义list_item_data.xml,列表的内容显示,要求其中含有CheckBox
?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" /
3. 定义数据显示的Adapter,在该Adapter中,我们需要实现两个重要的功能:控制是否显示CheckBox; 控制CheckBox是否显示
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;注1: flage 字段,用于标志是否显示CheckBox,通过在Activity中改变该值,即可在getView方法中控制是否显示CheckBox。
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);
//注意这里设置的不是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; }注2: 定义CheckBox的setOnClickListener方法,而不是onCheckedChangListener,如此使用,可方便控制CheckBox是否选中。
4. 定义Activity
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 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便实现了,欢迎指正!
如有疑问,欢迎进QQ群:487786925( Android研发村 )
相关文章
- [Android Pro] Android 4.1 使用 Accessibility实现免Root自动批量安装功能
- [Android Pro] fragment中嵌套viewpager,vierpager中有多个fragment,不显示
- [Android Traffic] 让android应用在传输网络数据的时候更省电
- [Android Pro] Android权限设置android.permission完整列表
- Android实例-程序切换到后台及从后台切换到前台
- android开发实践之1:安装部署环境设置
- Android API之android.provider.ContactsContract.RawContacts
- 二、Android Studio使用——导入jar包,运行、debug都不是问题
- macos安装android studio(Android Studio 2021.1.1)
- android 编程时,如何在Eclipse中查看Android源码或者第三方组件包源码
- android 进程和线程管理
- 《android开发艺术探索》读书笔记(九)--四大组件
- Android中文API(128) —— HandlerThread
- Android stuido 解决Caused by: android.view.InflateException: Binary XML file line #8: Binary XML file
- android studio 运行太慢了
- Android修行手册 - GridView实践回忆
- Android【报错】java.lang.ClassCastException: android.widget.TextView cannot be cast to android.widget.Bu
- Android的kotlin的报错提示:java.lang.ArrayIndexOutOfBoundsException: length=0; index=-1
- Android 11.0 12.0首次开机进入Launcher3前黑屏几秒的几种情况问题的总结
- Android 根据坐标点动态改变View的位置
- 【Android Gradle 插件】组件化中的 Gradle 构建脚本实现 ⑤ ( 优化 Gradle 构建脚本 | 构建脚本结构 | 闭包定义及用法 | 依赖配置 | android 块配置 )
- 【Android Gradle 插件】build.gradle 中的 android 配置 ( 配置项 | compileSdkVersion 配置 | buildToolsVersion 配置 )
- Android UI开发第三十篇——使用Fragment构建灵活的桌面
- android sqlite批量插入数据速度解决方案
- Android 系统回收资源时进程被杀的优先级
- Android红外功能模拟触摸鼠标事件唤醒屏幕
- Android Studio 理解com.android.support:appcompat-v7:x.x.x依赖包(建议收藏)
- Android 9.0/P(android p指安卓9.0版本) okhttp3网络请求出错
- Android 动态权限申请
- 迁移到Android后android.support.v4.content.FileProvider运行崩溃