2025-03-25

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;
			}
		}
	};

以上就是刪除功能的全部實現瞭,關於通訊錄模塊開發博客可能會暫停更新,比如想字母索引,聯系人分組等功能我還沒去實現,以後有機會會繼續分享。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *