<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_above="@+id/ll_edit_bar"></ListView><Viewandroid:layout_width="match_parent"android:layout_height="1px"android:layout_below="@+id/lv"android:background="@color/color_gray"/><LinearLayoutandroid:id="@+id/ll_edit_bar"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="4dp"android:background="@color/color_white"android:orientation="horizontal"android:translationZ="10dp"android:layout_alignParentBottom="true"android:visibility="gone"><LinearLayoutandroid:id="@+id/ll_cancel"style="@style/EditBarItemStyle"><ImageViewstyle="@style/EditBarImageViewStyle"android:src="@drawable/ic_cancel" /><TextViewstyle="@style/EditBarTextViewStyle"android:text="@string/str_cancel" /></LinearLayout><LinearLayoutandroid:id="@+id/ll_delete"style="@style/EditBarItemStyle"><ImageViewstyle="@style/EditBarImageViewStyle"android:layout_height="17dp"android:src="@drawable/ic_delete_blue" /><TextViewstyle="@style/EditBarTextViewStyle"android:text="@string/str_delete" /></LinearLayout><LinearLayoutandroid:id="@+id/ll_inverse"style="@style/EditBarItemStyle"><ImageViewstyle="@style/EditBarImageViewStyle"android:src="@drawable/ic_inverse" /><TextViewstyle="@style/EditBarTextViewStyle"android:text="@string/str_inverse" /></LinearLayout><LinearLayoutandroid:id="@+id/ll_select_all"style="@style/EditBarItemStyle"><ImageViewstyle="@style/EditBarImageViewStyle"android:src="@drawable/ic_select_all" /><TextViewstyle="@style/EditBarTextViewStyle"android:text="@string/str_select_all" /></LinearLayout></LinearLayout></RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_data"android:layout_width="0dp"android:layout_height="50dp"android:layout_marginLeft="15dp"android:layout_weight="1"android:gravity="center_vertical"android:text="111111"android:textColor="@color/colorPrimary" /><CheckBoxandroid:id="@+id/chb_select_way_point"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:buttonTint="@color/color_blue"android:layout_marginRight="20dp"android:clickable="false"android:focusable="false"android:visibility="gone" />
</LinearLayout>
package com.example.f.me1_listview_checkbox;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private ListView lvData;private LinearLayout mLlEditBar;//控制下方那一行的显示与隐藏private MyAdapter adapter;private List<String> mData = new ArrayList<>();//所有数据private List<String> mCheckedData = new ArrayList<>();//将选中数据放入里面private SparseBooleanArray stateCheckedMap = new SparseBooleanArray();//用来存放CheckBox的选中状态,true为选中,false为没有选中private boolean isSelectedAll = true;//用来控制点击全选,全选和全不选相互切换@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initData();adapter = new MyAdapter(MainActivity.this, mData, stateCheckedMap);lvData.setAdapter(adapter);setOnListViewItemClickListener();setOnListViewItemLongClickListener();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.ll_cancel:cancel();break;case R.id.ll_delete:delete();break;case R.id.ll_inverse:inverse();break;case R.id.ll_select_all:selectAll();break;}}private void cancel() {setStateCheckedMap(false);//将CheckBox的所有选中状态变成未选中mLlEditBar.setVisibility(View.GONE);//隐藏下方布局adapter.setShowCheckBox(false);//让CheckBox那个方框隐藏adapter.notifyDataSetChanged();//更新ListView}private void delete() {if (mCheckedData.size() == 0) {Toast.makeText(MainActivity.this, "您还没有选中任何数据!", Toast.LENGTH_SHORT).show();return;}final CustomDialog dialog = new CustomDialog(this);dialog.show();dialog.setHintText("是否删除?");dialog.setLeftButton("取消", new View.OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();}});dialog.setRightButton("确定", new View.OnClickListener() {@Overridepublic void onClick(View v) {beSureDelete();dialog.dismiss();}});}private void beSureDelete() {mData.removeAll(mCheckedData);//删除选中数据setStateCheckedMap(false);//将CheckBox的所有选中状态变成未选中mCheckedData.clear();//清空选中数据adapter.notifyDataSetChanged();Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();}
/*** 反选就是stateCheckedMap的值为true时变为false,false时变成true* */private void inverse() {mCheckedData.clear();for (int i = 0; i < mData.size(); i++) {if (stateCheckedMap.get(i)) {stateCheckedMap.put(i, false);} else {stateCheckedMap.put(i, true);mCheckedData.add(mData.get(i));}lvData.setItemChecked(i, stateCheckedMap.get(i));//这个好行可以控制ListView复用的问题,不设置这个会出现点击一个会选中多个}adapter.notifyDataSetChanged();}private void selectAll() {mCheckedData.clear();//清空之前选中数据if (isSelectedAll) {setStateCheckedMap(true);//将CheckBox的所有选中状态变成选中isSelectedAll = false;mCheckedData.addAll(mData);//把所有的数据添加到选中列表中} else {setStateCheckedMap(false);//将CheckBox的所有选中状态变成未选中isSelectedAll = true;}adapter.notifyDataSetChanged();}private void setOnListViewItemClickListener() {lvData.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {updateCheckBoxStatus(view, position);}});}/*** 如果返回false那么click仍然会被调用,,先调用Long click,然后调用click。* 如果返回true那么click就会被吃掉,click就不会再被调用了* 在这里click即setOnItemClickListener*/private void setOnListViewItemLongClickListener() {lvData.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {mLlEditBar.setVisibility(View.VISIBLE);//显示下方布局adapter.setShowCheckBox(true);//CheckBox的那个方框显示updateCheckBoxStatus(view, position);return true;}});}private void updateCheckBoxStatus(View view, int position) {MyAdapter.ViewHolder holder = (MyAdapter.ViewHolder) view.getTag();holder.checkBox.toggle();//反转CheckBox的选中状态lvData.setItemChecked(position, holder.checkBox.isChecked());//长按ListView时选中按的那一项stateCheckedMap.put(position, holder.checkBox.isChecked());//存放CheckBox的选中状态if (holder.checkBox.isChecked()) {mCheckedData.add(mData.get(position));//CheckBox选中时,把这一项的数据加到选中数据列表} else {mCheckedData.remove(mData.get(position));//CheckBox未选中时,把这一项的数据从选中数据列表移除}adapter.notifyDataSetChanged();}private void initView() {lvData = (ListView) findViewById(R.id.lv);mLlEditBar = findViewById(R.id.ll_edit_bar);findViewById(R.id.ll_cancel).setOnClickListener(this);findViewById(R.id.ll_delete).setOnClickListener(this);findViewById(R.id.ll_inverse).setOnClickListener(this);findViewById(R.id.ll_select_all).setOnClickListener(this);lvData.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);}private void initData() {for (int i = 0; i < 1000; i++) {mData.add("第" + i + "项");}setStateCheckedMap(false);}
/*** 设置所有CheckBox的选中状态* */private void setStateCheckedMap(boolean isSelectedAll) {for (int i = 0; i < mData.size(); i++) {stateCheckedMap.put(i, isSelectedAll);lvData.setItemChecked(i, isSelectedAll);}}@Overridepublic void onBackPressed() {if (mLlEditBar.getVisibility() == View.VISIBLE) {cancel();return;}super.onBackPressed();}
}
package com.example.f.me1_listview_checkbox;import android.content.Context;
import android.support.v7.widget.AppCompatCheckBox;
import android.util.SparseBooleanArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;import java.util.ArrayList;
import java.util.List;/*** Created by yangms on 2018/7/16.*/public class MyAdapter extends BaseAdapter {List<String> data = new ArrayList<>();private Context mContext;ViewHolder holder;private boolean isShowCheckBox = false;//表示当前是否是多选状态。private SparseBooleanArray stateCheckedMap = new SparseBooleanArray();//用来存放CheckBox的选中状态,true为选中,false为没有选中public MyAdapter(Context context, List<String> data, SparseBooleanArray stateCheckedMap) {this.data = data;mContext = context;this.stateCheckedMap = stateCheckedMap;}@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int i) {return null;}@Overridepublic long getItemId(int i) {return i;}@Overridepublic View getView(final int position, View convertView, ViewGroup viewGroup) {if (convertView == null) {holder = new ViewHolder();convertView = View.inflate(mContext, R.layout.item, null);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.checkBox = (AppCompatCheckBox) convertView.findViewById(R.id.chb_select_way_point);holder.mTvData = convertView.findViewById(R.id.tv_data);showAndHideCheckBox();//控制CheckBox的那个的框显示与隐藏holder.mTvData.setText(data.get(position));holder.checkBox.setChecked(stateCheckedMap.get(position));//设置CheckBox是否选中return convertView;}public class ViewHolder {public TextView mTvData;public AppCompatCheckBox checkBox;}private void showAndHideCheckBox() {if (isShowCheckBox) {holder.checkBox.setVisibility(View.VISIBLE);} else {holder.checkBox.setVisibility(View.GONE);}}public boolean isShowCheckBox() {return isShowCheckBox;}public void setShowCheckBox(boolean showCheckBox) {isShowCheckBox = showCheckBox;}}

Android 带CheckBox的ListView 实现多选,全选,反选,删除相关推荐

  1. 【转】Android 带checkbox的listView 实现多选,全选,反选 -- 不错

    原文网址:http://blog.csdn.net/onlyonecoder/article/details/8687811 Demo地址(0分资源):http://download.csdn.net ...

  2. Android 带checkbox的listView 实现多选,全选,反选

    由于listview的一些特性,刚开始写这种需求的功能的时候都会碰到一些问题,重点就是存储每个checkbox的状态值,在这里分享出了完美解决方法: 布局文件: [html] view plainco ...

  3. 带checkbox的ListView实现(一)——数据与渲染完全分离的传统实现方式

    带checkbox的ListView实现(一)--数据与渲染完全分离的传统实现方式

  4. vue 带全选和多选的表格怎么写_vue实现下拉列表多选全选以及模糊查询的vue组件...

    vue实现下拉列表多选全选以及模糊查询的vue组件 发布时间:2018-09-12 17:41, 浏览次数:3776 , 标签: vue <>前端,有时有这样的需求,需要一个下拉列表,还要 ...

  5. VUE:checkbox 单选框(单选、多选)、一选全选 / 全选一选、表格单选列实现

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 效果:如红框中部分. 一选全选:表头上的单选框选中则下面每行都选中. 全选一选:表中数据每行都 ...

  6. 带checkbox的listView 实现多选,全选,反选

    转载自csdn作者:mavenly 链接:http://blog.csdn.net/onlyonecoder/article/details/8687811 Demo地址(0分资源):http://d ...

  7. Android开发中ListView多屏的全选、反选功能

    [size=medium] 鄙人最近刚开始学习Android,在练习的时候写到一个ListView的全选反选功能.本来以为这个功能很简单,随随便便就能搞定,结果真的下手去做的时候被虐的死去活来,不知道 ...

  8. Android RecyclerVIew 列表实现 编辑、单选、全选、删除、动画效果(附源码)

    前言 眼下都2020年了,你不会还在使用ListView吧? 正文 因为最近写的一个项目里面有关于列表的编辑相关的功能,其实也是类似与腾讯视频的观看历史的列表操作,你可以先尝试一下,写这个主要是业务逻 ...

  9. 在Indicator中添加动态Checkbox,无需绑定数据源,支持全选 - Ehlib学习(二)

    先做设置 DBGrideh属性设置: IndicatorOptions = [gioShowRowIndicatorEh, //小三角指示 gioShowRecNoEh, //数据源行号 gioSho ...

最新文章

  1. SQL Server中常用的快捷键
  2. 台湾大学林轩田机器学习技法课程学习笔记2 -- Dual Support Vector Machine
  3. python中csv模块读写文件
  4. activex java 控件_java 如何调用ActiveX控件??
  5. php开发微信图灵机器人
  6. delphi 调用php接口_《细说PHP》第四版 样章 第23章 自定义PHP接口规范 5
  7. 【codevs3732】【BZOJ3751】解方程,hash+秦九韶算法
  8. Maven : error: missing or invalid dependency detected while loading class file 'RDD.class'
  9. k8s核心技术-Helm(chart模板的使用下)---K8S_Google工作笔记0049
  10. 计算机软件资料统计表,幼儿园评估资料参考目录(中心幼儿园)
  11. JDBC数据库驱动的下载、安装与连接
  12. 【Linux环境下C语言编程】
  13. 基于SSM的酒店客房管理系统的设计(包含数据库、完美运行、可远程调试)
  14. Linux安装wget
  15. express获取url路由地址参数的方法 获取get请求参数
  16. iOS开发笔记 -- 动态切换APP的logo
  17. 在线阅读.epub文件的网站
  18. 紫薇圣人的程序员人生[原创IT小说]
  19. C# 特性Description的值的获取
  20. 音视频智能分析技术EasyCVR在森林火灾监测项目中的应用

热门文章

  1. python实现lol解说抽奖
  2. Excel单元格如何增加下拉选项(类似于web中的select选项框)
  3. VTK图像处理颜色映射(一)
  4. 淘宝直播背后刀刃“砍”在哪?刘涛以2700万GMV收官
  5. 匹配表情emoji 正则_ruby中的一个示例正则表达式将匹配任何表情符号?
  6. 解决keil出现cpu is not halted cannot read register XX while cpu is running的另类方法
  7. php获取数组的最后一个元素
  8. Python攻防-Socket通信建立TCP反向连接
  9. 11.RT-thread项目实战--usb_device 模拟读卡器
  10. iOS 12已正式推送,流畅度提升了,值得体验!