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

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

效果如下:

MultiSelectActivity

/**
 * MultiSelectActivity
 */
public class MultiSelectActivity extends Activity implements OnClickListener,
    OnItemClickListener {
  private static final String TAG = "MultiSelectActivity";
  private ListView contactsDelList;
  private Button contactsDelBtn;
  private Button contactsCancelBtn;
  private CheckBox selectAll;
  private Cursor cursor;
  private ContactsDeleteAdapter contactsDeleteAdapter; 

  private static final String[] PROJECTION = new String[] { Contacts._ID,
      Contacts.DISPLAY_NAME };
  private static final int CONTACTS_ID_INDEX = 0;
  private static final int DISPLAY_NAME_INDEX = 1;
  private ContactsDeleteListItemViews holderViews; 

  private final class ContactsDeleteListItemViews {
    TextView nameView;
    CheckBox delCheckBox;
  } 

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contacts_delete_activity);
    contactsDelList = (ListView) findViewById(R.id.contacts_delete_list);
    contactsDelBtn = (Button) findViewById(R.id.contacts_delete_btn);
    contactsCancelBtn = (Button) findViewById(R.id.contacts_cancel_btn);
    selectAll = (CheckBox) (findViewById(R.id.contacts_delete_list_header)
        .findViewById(R.id.select_all));
    contactsDelList.setOnItemClickListener(this);
    contactsDelBtn.setOnClickListener(this);
    contactsCancelBtn.setOnClickListener(this);
    selectAll.setOnClickListener(this);
  } 

  @Override
  protected void onResume() {
    super.onResume();
    refreshData();
  } 

  // 查询数据库
  private void refreshData() {
    cursor = getContentResolver().query(Contacts.CONTENT_URI, PROJECTION,
        null, null, null);
    contactsDeleteAdapter = new ContactsDeleteAdapter(this, cursor);
    contactsDelList.setAdapter(contactsDeleteAdapter);
  } 

  class ContactsDeleteAdapter extends BaseAdapter {
    Cursor cur;
    Map<Integer, Boolean> selectedMap;
    HashSet<String> delContactsIdSet; 

    public ContactsDeleteAdapter(Context context, Cursor c) {
      cur = c;
      // 保存每条记录是否被选中的状态
      selectedMap = new HashMap<Integer, Boolean>();
      // 保存被选中记录作数据库表中的Id
      delContactsIdSet = new HashSet<String>(); 

      for (int i = 0; i < cur.getCount(); i++) {
        selectedMap.put(i, false);
      }
    } 

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      if (convertView == null) {
        convertView = LayoutInflater.from(MultiSelectActivity.this)
            .inflate(R.layout.contacts_delete_list_item, null);
        holderViews = new ContactsDeleteListItemViews();
        holderViews.nameView = (TextView) convertView
            .findViewById(R.id.name);
        holderViews.delCheckBox = (CheckBox) convertView
            .findViewById(R.id.delete_list_item);
        convertView.setTag(holderViews);
      }
      cur.moveToPosition(position);
      ContactsDeleteListItemViews views = (ContactsDeleteListItemViews) convertView
          .getTag();
      final String name = cur.getString(DISPLAY_NAME_INDEX);
      views.nameView.setText(name);
      views.delCheckBox.setChecked(selectedMap.get(position));
      // 保存记录Id
      if (selectedMap.get(position)) {
        delContactsIdSet.add(String.valueOf(cur
            .getInt(CONTACTS_ID_INDEX)));
      } else {
        delContactsIdSet.remove(String.valueOf(cur
            .getInt(CONTACTS_ID_INDEX)));
      }
      return convertView;
    } 

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

    @Override
    public Object getItem(int position) {
      if (cur.moveToPosition(position)) {
        return cur;
      } else {
        return null;
      }
    } 

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

  @Override
  public void onClick(View v) {
    switch (v.getId()) {
    case R.id.select_all:
      // 全选CheckBox的click事件处理
      if (selectAll.isChecked()) {
        for (int i = 0; i < contactsDeleteAdapter.getCount(); i++) {
          contactsDeleteAdapter.selectedMap.put(i, true);
          //click事件:全选checkbox被勾选则把所有的联系人ID添加到delContactsIdSet中
          contactsDeleteAdapter.cur.moveToPosition(i);
          contactsDeleteAdapter.delContactsIdSet.add(String
              .valueOf(contactsDeleteAdapter.cur
                  .getInt(CONTACTS_ID_INDEX)));
        }
        contactsDelBtn.setEnabled(true);
      } else {
        for (int i = 0; i < contactsDeleteAdapter.getCount(); i++) {
          contactsDeleteAdapter.selectedMap.put(i, false);
        }
        //click事件:全选checkbox被取消勾选则把delContactsIdSet清空
        contactsDeleteAdapter.delContactsIdSet.clear();
        contactsDelBtn.setEnabled(false);
      }
      contactsDeleteAdapter.notifyDataSetChanged();
      break;
    case R.id.contacts_delete_btn:
      new AlertDialog.Builder(this).setTitle(
          R.string.clearConfirmation_title).setMessage(
          R.string.clearConfirmation).setNegativeButton(
          android.R.string.cancel, null).setPositiveButton(
          android.R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
              final ProgressDialog progressDialog = ProgressDialog
                  .show(
                      MultiSelectActivity.this,
                      getString(R.string.clearProgress_title),
                      "", true, false);
              final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                  // 删除记录事件处理(我这里就不写详细的代码了)
                  return null;
                } 

                @Override
                protected void onPostExecute(Void result) {
                  progressDialog.dismiss();
                }
              };
              progressDialog.show();
              task.execute();
            }
          }).setCancelable(true).create().show();
      break;
    case R.id.contacts_cancel_btn:
      // 取消事件处理
      break;
    }
  } 

  @Override
  public void onItemClick(AdapterView<?> arg0, View view, int position,
      long id) {
    Log.i(TAG, "onItemClick");
    ContactsDeleteListItemViews views = (ContactsDeleteListItemViews) view
        .getTag();
    views.delCheckBox.toggle();
    contactsDeleteAdapter.selectedMap.put(position, views.delCheckBox
        .isChecked());
    contactsDeleteAdapter.notifyDataSetChanged();
    // 判断是否有记录没被选中,以便修改全选CheckBox勾选状态
    if (contactsDeleteAdapter.selectedMap.containsValue(false)) {
      selectAll.setChecked(false);
    } else {
      selectAll.setChecked(true);
    }
    // 判断是否有记录被选中,以便设置删除按钮是否可用
    if (contactsDeleteAdapter.selectedMap.containsValue(true)) {
      contactsDelBtn.setEnabled(true);
    } else {
      contactsDelBtn.setEnabled(false);
    }
  }
}

布局文件:contacts_delete_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
  zuolongsnail@163.com
  This layout of delete contacts.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" > 

  <include
    android:id="@+id/contacts_delete_list_header"
    layout="@layout/contacts_delete_list_header" /> 

  <ListView
    android:id="@+id/contacts_delete_list"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="1" /> 

  <LinearLayout
    style="@android:style/ButtonBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" > 

    <Button
      android:id="@+id/contacts_delete_btn"
      android:layout_width="0dip"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:enabled="false"
      android:text="@string/delete" /> 

    <Button
      android:id="@+id/contacts_cancel_btn"
      android:layout_width="0dip"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:text="@string/cancel" />
  </LinearLayout> 

</LinearLayout>

代码下载地址:源码下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 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 + 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绑定CheckBox实现全选增加和删除功能(DEMO)

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

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

    APP的开发中,会常遇到这样的需求:批量取消(删除)List中的数据.这就要求ListVIew支持批量选择.全选.单选等等功能,做一个比较强大的ListView批量选择功能是很有必要的,那如何做呢? 可想而知,要支持批量选择,那CheckBox的使用是不可或缺的,下面,就使用ListView结合CheckBox实现数据的批量选择. 先看下效果图,有图有真相: 先说明接下来要实现的ListView+CheckBox支持的功能:     1.  外部点击"编辑"(长按ListView的某一

  • 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 ExpandableListView实现多选,单选,全选,edittext实现批量输入的实例代码

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

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

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

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

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

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

随机推荐