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

时间:2021-05-20

应用开发中经常会有从数据库中读取数据显示,然后选中多条、全部记录并且删除的需求。在做定制系统联系人的时候也遇到这样的需求,下面写个简单的通过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>

代码下载地址:源码下载

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

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章