Android中ListView结合CheckBox实现数据批量选择(全选、反选、全不选)

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" /> 

 </LinearLayout> 

 <LinearLayout
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="center_vertical"
  android:orientation="horizontal"
  android:paddingBottom="10dp"
  android:paddingTop="10dp"> 

  <View
   android:id="@+id/user_head_img"
   android:layout_width="5dp"
   android:layout_height="fill_parent"
   android:background="#4483c9" /> 

  <LinearLayout
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:orientation="vertical"> 

   <TextView
    android:id="@+id/text_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:singleLine="true"
    android:text="标题"
    android:textColor="#555555"
    android:textSize="16sp" /> 

   <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:gravity="center_vertical"
    android:orientation="horizontal"> 

    <TextView
     android:id="@+id/text_desc"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_gravity="center_vertical"
     android:gravity="bottom"
     android:singleLine="true"
     android:text="描述描述描述描述描述描述"
     android:textColor="#aaaaaa"
     android:textSize="14sp" /> 

   </LinearLayout>
  </LinearLayout>
 </LinearLayout> 

</LinearLayout>

2.  定义数据显示的Bean

public class DataBean { 

 public String id; 

 public String title; 

 public String desc; 

 public boolean isCheck; 

 public DataBean(String id, String title, String desc) {
  this.id = id;
  this.title = title;
  this.desc = desc;
 }
}

注:databean中含有isCheck属性,该属性主要标志CheckBox是否选中。
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; 

public class MyAdapter extends BaseAdapter { 

 private Context mContext; 

 private List<DataBean> mDatas; 

 private LayoutInflater mInflater; 

 public boolean flage = false; 

 public MyAdapter(Context mContext, List<DataBean> mDatas) {
  this.mContext = mContext;
  this.mDatas = mDatas; 

  mInflater = LayoutInflater.from(this.mContext); 

 } 

 @Override
 public int getCount() {
  return mDatas.size();
 } 

 @Override
 public Object getItem(int i) {
  return mDatas.get(i);
 } 

 @Override
 public long getItemId(int i) {
  return i;
 } 

 @Override
 public View getView(int position, View convertView, ViewGroup viewGroup) { 

  ViewHolder holder = null; 

  if (convertView == null) {
   // 下拉项布局
   convertView = mInflater.inflate(R.layout.list_item_data, null); 

   holder = new ViewHolder(); 

   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); 

   // 根据isSelected来设置checkbox的显示状况
   if (flage) {
    holder.checkboxOperateData.setVisibility(View.VISIBLE);
   } else {
    holder.checkboxOperateData.setVisibility(View.GONE);
   } 

   holder.checkboxOperateData.setChecked(dataBean.isCheck); 

   //注意这里设置的不是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;
 }
}

注1: flage 字段,用于标志是否显示CheckBox,通过在Activity中改变该值,即可在getView方法中控制是否显示CheckBox。
注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 < 20; 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便实现了,希望大家喜欢。

(0)

相关推荐

  • Android实现ListView控件的多选和全选功能实例

    本文实例讲述了Android实现ListView控件的多选和全选功能.分享给大家供大家参考,具体如下: 主程序代码 MainActivity.Java package yy.test; import java.util.ArrayList; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.vi

  • Android ListView实现单选及多选等功能示例

    本文实例讲述了Android ListView实现单选及多选等功能的方法.分享给大家供大家参考,具体如下: 在项目中也遇到过给ListView的item添加选择功能.比如一个网购APP,有个历史浏览页面,这个页面现点击item单选/多选及全选删除功能. 当时也是通过在数据中添加一个是否选择的字段来记录item的状态,然后根据这个字段有相应的position位置进行选择状态更改及删除操作. 刚刚看了Android API Demos中17种ListView的实现方法,发现ListView自身就带有

  • Android ListView构建支持单选和多选的投票项目

    引言 我们在android的APP开发中有时候会碰到提供一个选项列表供用户选择的需求,如在投票类型的项目中,我们提供一些主题给用户选择,每个主题有若干选项,用户对这些主题的选项进行选择,然后提交. 本文以一个支持单选和多选投票项目为例,演示了在一个ListView中如何构建CheckBox列表和RadioButton列表,并分析了实现的原理和思路,提供有需要的朋友参考. 项目的演示效果如下. 数据源 通常我们的数据源来自于数据库.首先,我们构建投票项目类SubjectItem. /** * 主题

  • Android ListView ImageView实现单选按钮实例

    做Android开发两年的时间,技术稍稍有一些提升,刚好把自己实现的功能写出来,记录一下,如果能帮助到同行的其他人,我也算是做了件好事,哈哈!!废话不多说,先上个图. 先上一段代码: 1 if (lastposition == position){ 2 viewHolder.setImageResource(R.id.iv_yuandian1,R.mipmap.ic_button_checked); 3 } else { 4 viewHolder.setImageResource(R.id.iv

  • Android的ListView多选删除操作实现代码

    最近尝试做了个listview的多选demo,网上看其他人的例子感觉不是很难,自己动手做了下,各种细节问题,没那么简单啊.既然做了,简单写个笔记记录下. 练手demo,命名笔记乱,不要介意哦. 主界面布局activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/to

  • android基于ListView和CheckBox实现多选和全选记录的功能

    应用开发中经常会有从数据库中读取数据显示,然后选中多条.全部记录并且删除的需求.在做定制系统联系人的时候也遇到这样的需求,下面写个简单的通过ListView和CheckBox实现多选.全选的例子.下面是具体的代码. 效果如下: MultiSelectActivity /** * MultiSelectActivity */ public class MultiSelectActivity extends Activity implements OnClickListener, OnItemCli

  • Android ListView获得选项中的值

    在Android中我们要如何获取ListView选中项的值呢? 我们举个例子,假如我们已经获得了手机中保存的联系人姓名和电话号码,并把它们显示在了一个Android ListView中,现在要实现的功能是当点击选中项时直接拨号,那么如何取得此时Android ListView中的号码? 要显示联系人姓名和电话号码,那你现在肯定已经在listview 的item里面放了两个控件吧,假如是textview吧,那你就首先要给listview添加一个OnItemClickListener来监听你点击了那

  • Android中ListView + CheckBox实现单选、多选效果

    还是先来看看是不是你想要的效果: 不废话,直接上代码,很简单,代码里都有注释 1 单选 public class SingleActivity extends AppCompatActivity { private ListView listView; private ArrayList<String> groups; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta

  • Android listview ExpandableListView实现多选,单选,全选,edittext实现批量输入的实例代码

    最近在项目开发中,由于项目的需求要实现一些列表的单选,多选,全选,批量输入之类的功能,其实功能的实现倒不是很复杂,需求中也没有涉及到复杂的动画什么之类,主要是解决列表数据复用的问题,解决好这个就可以了.下面是最近项目中涉及到的一些: listview实现多选.全选.取消全选: 下面是适配器,一开始在适配器的构造函数中,对数据进行初始化,同时定义一个集合用于管理listview的点击: class BatchAdpter extends BaseAdapter { private HashMap<

  • Android实现便于批量操作可多选的图片ListView实例

    本文实例讲述了Android实现便于批量操作可多选的图片ListView.分享给大家供大家参考,具体如下: 之前项目需要实现一个可多选的图片列表,用户选中一到多张图片后,批量上传.但是网上有可多选普通列表的代码.也有单纯图片列表的代码,却没有两者合并的代码,只好自己实现一个. 废话不说,直接上代码. 先是两个layout: 1.main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout

  • Android中ListView绑定CheckBox实现全选增加和删除功能(DEMO)

    ListView控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adapter的用法,加了很多的判断等等等等-.我们先来看看实现的效果吧! 好的,我们新建一个项目LvCheckBox 我们事先先把这两个布局写好吧,一个是主布局,还有一个listview的item.xml,相信不用多说 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/

随机推荐