Android通訊錄開發之實現刪除功能
2014年1月15日
無論是Android開發或者是其他移動平臺的開發,ListView肯定是一個大咖,那麼對ListView的操作肯定是不會少的,上一篇博客介紹瞭如何實現全選和反選的功能,本篇博客介紹刪除功能,刪除列表中的項無謂就是及時刷新列表,這又跟UI線程扯上關系瞭,還是那句話,數據的更新通知一定要在UI線程上做,不然會出現各種錯誤,比如出現adapter數據源改變,但沒有及時收到通知的情況。在執行遍歷刪除的時候,最好不要每刪一個就直接通知,下面是我的實現方法,將需要刪除的contact保存到一個List然後通過handler發生消息,然後再由handler來處理。
vcD4KPHA+PC9wPgo8cD48aW1nIHNyYz0=”/uploadfile/Collfiles/20140115/20140115135043364.png” width=”320″ height=”500″ alt=”\”>
這裡我順帶提一下菜單的實餡喎?/kf/yidong/wp/” target=”_blank” class=”keylink”>WPC9wPgo8cD48c3Ryb25nPjGhorao0uVtZW51z8K1xHhtbM7EvP48L3N0cm9uZz48L3A+CjxwPjwvcD4KPHByZSBjbGFzcz0=”brush:java;”>
icon為菜單圖標
title為菜單文本
2. 代碼實現
/** * 創建菜單 */ @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.meetting_contact_menu, menu); selectAllItem = menu.findItem(R.id.select_all_item); return true; } // 當用戶打開菜單的時候觸發 @Override public boolean onMenuOpened(int featureId, Menu menu) { if (menu != null) { refreshSelectAllItemIcon(); } return super.onMenuOpened(featureId, menu); } /** * menu的點擊事件 */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.select_all_item: if (isAllChecked) { // 反選 item.setIcon(R.drawable.select_all_not); invertSelection(); } else { // 全選 if (contactList.size() == 0) { Toast.makeText(this, "目前沒有可選的聯系人", Toast.LENGTH_SHORT) .show(); break; } item.setIcon(R.drawable.select_all); selectAllContacts(); } break; case R.id.delete_item: // 刪除 if (count == 0) { Toast.makeText(this, "您還沒有選擇任何聯系人", Toast.LENGTH_SHORT).show(); break; } showDeleteDialog(this, "您確定要刪除嗎"); isAllChecked = false; selectAllItem.setIcon(R.drawable.select_all_not); break; case R.id.sync_item: Intent fresh_intent = new Intent(this, CloudSyncActivity.class); if (flag) {// 如果是會議 fresh_intent.putExtra("number", meetingNumber); } startActivityForResult(fresh_intent, CLOUD_SYNC); break; default: break; } return false; } // 刷新菜單項全選 private void refreshSelectAllItemIcon() { for (String contactId : map_NumberSelected.keySet()) { if (!map_NumberSelected.get(contactId)) { isAllChecked = false; selectAllItem.setIcon(R.drawable.select_all_not); break; } isAllChecked = true; selectAllItem.setIcon(R.drawable.select_all); } }
提示刪除的對話框
/** 顯示確認刪除對話框 **/ public void showDeleteDialog(Context context, String msg) { final Dialog dialog = new Dialog(context, R.style.MyDialog); View view = LayoutInflater.from(context).inflate(R.layout.back_dialog, null); TextView msg_tv = (TextView) view.findViewById(R.id.msg); msg_tv.setText(msg); Button sure = (Button) view.findViewById(R.id.sure); Button cancle = (Button) view.findViewById(R.id.cancle); dialog.setContentView(view); sure.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { deleteContacts(); dialog.dismiss(); } }); cancle.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); } }); dialog.show(); }
下面是刪除操作:
這裡隻關註實現刪除的脈路,其中有些代碼是業務邏輯需要可以稍微看一下就可以瞭
// 刪除選中的聯系人 public void deleteContacts() { DialogHelp.getInstance().showHttpDialog(this, R.string.wait_for_while, getString(R.string.deleting_contact)); new Thread() { @Override public void run() { ArrayList deleteContacts = new ArrayList(); for (Contact contact : contactList) { boolean isselected = map_NumberSelected .get(contact.getId()); if (isselected) { for (RawContact rawContact : rawList) { if (contact.getUserId() == rawContact.getUserId()) { // 是同一個id if (contact.getNumber() == rawContact .getPhone1()) { rawContact.setPhone1(null); } else if (contact.getNumber() == rawContact .getPhone2()) { rawContact.setPhone2(null); } else if (contact.getNumber() == rawContact .getTelephone()) { rawContact.setTelephone(null); } if ((rawContact.getPhone1() == null || "" .equals(rawContact.getPhone1())) && (rawContact.getPhone2() == null || "" .equals(rawContact.getPhone2())) && (rawContact.getTelephone() == null || "" .equals(rawContact .getTelephone()))) { MyDataBase.deleteContact( MeetingContactActivity.this, rawContact); } else { MyDataBase.updateContactById( MeetingContactActivity.this, rawContact); } break; } } // 將需要刪除的聯系人保存下來 deleteContacts.add(contact); } } Message msg = new Message(); msg.obj = deleteContacts; msg.what = DELETE_COMPLETE; handler.sendMessage(msg); }; }.start(); }
deleteContacts是用來保存需要刪除的聯系人,把它賦給msg.obj,再通過handler將消息放入消息隊列,最終在handler的handleMessage方法進行刪除操作。
handler處理代碼:
這裡把傳遞過來list在contactList遍歷刪除,然後在msg.what為DELETE_COMPLETE的分支進行通知列表刷新。
private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.obj != null) { ArrayList deleteContacts = (ArrayList) msg.obj; for (Contact contact : deleteContacts) { map_NumberSelected.remove(contact.getId()); contactList.remove(contact); } } switch (msg.what) { case LOAD_CONTACT_FINISHED: // 判斷是否為空 if (contactList == null || contactList.size() == 0) { syncLayout.setVisibility(View.VISIBLE); bottomLayout.setVisibility(View.GONE); listView.setVisibility(View.GONE); } else { syncLayout.setVisibility(View.GONE); bottomLayout.setVisibility(View.VISIBLE); listView.setVisibility(View.VISIBLE); } adapter.setContactList(contactList); refreshList(); DialogHelp.getInstance().dismissDialog(); break; case CLOUD_SYNC: // 同步 initContacts(); refreshList(); break; case SEARCH_FINISH: refreshList(); break; case DELETE_COMPLETE: // 刪除完畢 DialogHelp.getInstance().dismissDialog(); // 重新初始化 refreshList(); break; } } };
以上就是刪除功能的全部實現瞭,關於通訊錄模塊開發博客可能會暫停更新,比如想字母索引,聯系人分組等功能我還沒去實現,以後有機會會繼續分享。