android基于ListView和CheckBox實現(xiàn)多選和全選記錄的功能
應(yīng)用開發(fā)中經(jīng)常會有從數(shù)據(jù)庫中讀取數(shù)據(jù)顯示,然后選中多條、全部記錄并且刪除的需求。在做定制系統(tǒng)聯(lián)系人的時候也遇到這樣的需求,下面寫個簡單的通過ListView和CheckBox實現(xiàn)多選、全選的例子。下面是具體的代碼.
效果如下:
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(); } // 查詢數(shù)據(jù)庫 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; // 保存每條記錄是否被選中的狀態(tài) selectedMap = new HashMap<Integer, Boolean>(); // 保存被選中記錄作數(shù)據(jù)庫表中的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被勾選則把所有的聯(lián)系人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) { // 刪除記錄事件處理(我這里就不寫詳細(xì)的代碼了) 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勾選狀態(tài) if (contactsDeleteAdapter.selectedMap.containsValue(false)) { selectAll.setChecked(false); } else { selectAll.setChecked(true); } // 判斷是否有記錄被選中,以便設(shè)置刪除按鈕是否可用 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>
代碼下載地址:源碼下載
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android中ListView + CheckBox實現(xiàn)單選、多選效果
- Android listview ExpandableListView實現(xiàn)多選,單選,全選,edittext實現(xiàn)批量輸入的實例代碼
- Android ListView構(gòu)建支持單選和多選的投票項目
- Android的ListView多選刪除操作實現(xiàn)代碼
- Android中ListView結(jié)合CheckBox實現(xiàn)數(shù)據(jù)批量選擇(全選、反選、全不選)
- Android中ListView綁定CheckBox實現(xiàn)全選增加和刪除功能(DEMO)
- Android ListView ImageView實現(xiàn)單選按鈕實例
- Android ListView獲得選項中的值
- Android實現(xiàn)便于批量操作可多選的圖片ListView實例
- Android實現(xiàn)ListView控件的多選和全選功能實例
- Android ListView實現(xiàn)單選及多選等功能示例
相關(guān)文章
詳解Android ScrollView嵌套EditText出現(xiàn)的滑動問題
本篇文章主要介紹了詳解ScrollView嵌套EditText出現(xiàn)的滑動問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01Android根據(jù)電話號碼獲得聯(lián)系人頭像實例代碼
這篇文章主要介紹了Android根據(jù)電話號碼獲得聯(lián)系人頭像實例代碼,是Android程序開發(fā)中非常重要的技巧,需要的朋友可以參考下2014-09-09android中打開相機(jī)、打開相冊進(jìn)行圖片的獲取示例
本篇文章主要介紹了android中打開相機(jī)、打開相冊進(jìn)行圖片的獲取示例,非常具有實用價值,需要的朋友可以參考下。2017-01-01基于Android Service 生命周期的詳細(xì)介紹
本篇文章小編為大家介紹,基于Android Service 生命周期的詳解。需要的朋友參考下2013-04-04Android 退出應(yīng)用程序的實現(xiàn)方法
這篇文章主要介紹了Android 退出應(yīng)用程序的實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-04-04Android基于高德地圖完全自定義Marker的實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Android基于高德地圖完全自定義Marker的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07FrameLayout和Fragment處理Android應(yīng)用UI布局實例
這篇文章主要介紹了FrameLayout和Fragment處理Android應(yīng)用UI布局實例,安卓3.0以后Fragment的出現(xiàn)為多尺寸屏幕的適配帶來了方便,需要的朋友可以參考下2016-02-02