`
endual
  • 浏览: 3506780 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 
阅读更多

[原]基于ListView和CheckBox实现多选和全选记录的功能
应用开发中经常会有从数据库中读取数据显示,然后选中多条、全部记录并且删除的需求。在做定制系统联系人的时候也遇到这样的需求,下面写个简单的通过ListView和CheckBox实现多选、全选的例子。下面是具体的代码,有问题请留言。代码下载地址:MultiSelect.rar
 
MultiSelectActivity
/**
 * @author zuolongsnail@163.com 
 * 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>

 
 
作者:zuolongsnail 发表于2011-12-8 10:17:39 原文链接
阅读:627 评论:0 查看评论
分享到:
评论
4 楼 milk713785 2015-06-06  
这段还是有点问题,最后把判断去掉了。因为这个方法被调用的次数跟我预期的不太一样。
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {  
        if (columnIndex == 1) {  
            checkBoxList.add((CheckBox) ((TableRow) view.getParent()).findViewById(R.id.checkBox));  
        }  
        return false;  
    } 
3 楼 milk713785 2015-06-06  
在全局定义checkBox变量,就可以在全局使用:
ArrayList<CheckBox> checkBoxList = new ArrayList<CheckBox>();


另外,改写以下代码段:
checkBoxList.add((CheckBox) ((TableRow) view.getParent()).findViewById(R.id.checkBox)); 

可以为CheckBox添加执行的setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()的方法,实现同样效果,就不需要那么多行代码了。
2 楼 milk713785 2015-06-06  
发现个更简单的方法,用安卓提供的高级组件,只要重写setViewBinder就能实现该功能:

        DataBaseAccessUtil dataBaseAccessUtil = new DataBaseAccessUtil(this);
        simpleCursorAdapter = dataBaseAccessUtil.getIDCardHistoryAdapter(this);
        simpleCursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
            public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
                if (columnIndex == 1) {
                    checkBoxList.add((CheckBox) ((TableRow) view.getParent()).findViewById(R.id.checkBox));
                }
                return false;
            }
        });


    public SimpleCursorAdapter getIDCardHistoryAdapter(Context context) {
        IDCardDao idCardDao = new IDCardDao();
        Cursor cursor = idCardDao.getSelectCursor(customSQLiteOpenHelper);
        SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(context, R.layout.idcard_history_list, cursor,
                new String[]{IDCardDao.COLUMN_ID, IDCardDao.COLUMN_ID_NUMBER, IDCardDao.COLUMN_SEX, IDCardDao.COLUMN_BIRTHDAY, IDCardDao.COLUMN_ADDRESS},
                new int[]{R.id._id, R.id.id_number, R.id.sex, R.id.birthday, R.id.address}, 0);
        return simpleCursorAdapter;
    }


        public Cursor getSelectCursor(SQLiteOpenHelper sqLiteOpenHelper) {
            Cursor cursor = sqLiteDatabase.query(TABLE_NAME, new String[]{COLUMN_ID, COLUMN_ID_NUMBER, COLUMN_SEX, COLUMN_BIRTHDAY, COLUMN_ADDRESS}, null, null, null, null, COLUMN_ID);
            return cursor;
        }
1 楼 cloudfile 2013-11-09  
谢谢
分享

相关推荐

Global site tag (gtag.js) - Google Analytics