<?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. SAP WM Storage Type Search配置里的Storage Class WPC标记
  2. 在 C# 中 (x == X) 何时成立?
  3. 【机器学习】传统目标检测算法之级联分类器Cascade
  4. 关于RMQ问题的四种解法
  5. 计算机网络链接的主要目标 主要功能,计算机网络课程教案‌.doc
  6. mysql中的索引什么意思_索引是什么意思(数据库中的索引是什么)
  7. Expm 1_2 实现快速排序的算法,并尝试采用不同的方法实现线性的划分过程.
  8. Commons- BeanUtils学习笔记(转)
  9. 巧用margin/padidng的百分比值占位,避免闪烁
  10. c语言 api接口测试工具,Restlet Client插件
  11. 青岛理工大学QUT期末考试《电子商务概论》思维导图
  12. 记录一下unity 加载外部视频
  13. 21届本科大数据菜鸡:我是怎么在互联网寒冬拿到腾讯、华为、京东、美团、快手等大厂offer的?
  14. zblog php 调用缩略图,zblog调用文章缩略图的方法
  15. 软件开发人员如何记笔记
  16. 几组数据的相关性python_几的笔顺 笔画数:2 拼音:jī,jǐ 部首:几 - 智慧山
  17. 丰巢取快递系统(一)
  18. Apollo 2.0 传感器标定方法 使用指南(官方)
  19. html css特效,15个超酷的CSS3代码特效展示
  20. yuv与rgb图像格式转换

热门文章

  1. tushare 根据每日指标打分法选股
  2. 为linux增加java网络端口_linux 更改项目端口号
  3. 非上市公司如何推进股权激励
  4. java垃圾收集器zgc,ZGC简介:可扩展的低延时JVM垃圾收集器
  5. 高能来袭,CG世纪交易所合约交易公测正式启动
  6. 《移动互联网的秘密》
  7. 【PHP】10个值得深思的PHP面试问题
  8. observable android,RxAndroid中observable的基本使用和表单校验操作
  9. 微信弯道超车!推出微信支付零花钱,可以用来发红包、转账,太香了!
  10. 树、森林与二叉树的转换以及其应用