Android通訊錄開發(fā)之刪除功能的實(shí)現(xiàn)方法
無論是Android開發(fā)或者是其他移動(dòng)平臺(tái)的開發(fā),ListView肯定是一個(gè)大咖,那么對(duì)ListView的操作肯定是不會(huì)少的,上一篇博客介紹了如何實(shí)現(xiàn)全選和反選的功能,本篇博客介紹刪除功能,刪除列表中的項(xiàng)無謂就是及時(shí)刷新列表,這又跟UI線程扯上關(guān)系了,還是那句話,數(shù)據(jù)的更新通知一定要在UI線程上做,不然會(huì)出現(xiàn)各種錯(cuò)誤,比如出現(xiàn)adapter數(shù)據(jù)源改變,但沒有及時(shí)收到通知的情況。在執(zhí)行遍歷刪除的時(shí)候,最好不要每刪一個(gè)就直接通知,下面是我的實(shí)現(xiàn)方法,將需要?jiǎng)h除的contact保存到一個(gè)List然后通過handler發(fā)生消息,然后再由handler來處理。
這里我順帶提一下菜單的實(shí)現(xiàn)
1、定義menu下的xml文件
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<group android:id="@+id/metting_menu" >
<item
android:id="@+id/select_all_item"
android:icon="@drawable/select_all_not"
android:title="全選">
</item>
<item
android:id="@+id/delete_item"
android:icon="@drawable/delete"
android:title="刪除">
</item>
<item
android:id="@+id/sync_item"
android:icon="@drawable/sync_manage"
android:title="同步">
</item>
</group>
</menu>
icon為菜單圖標(biāo)
title為菜單文本
2. 代碼實(shí)現(xiàn)
/**
* 創(chuàng)建菜單
*/
@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;
}
// 當(dāng)用戶打開菜單的時(shí)候觸發(fā)
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (menu != null) {
refreshSelectAllItemIcon();
}
return super.onMenuOpened(featureId, menu);
}
/**
* menu的點(diǎn)擊事件
*/
@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, "目前沒有可選的聯(lián)系人", Toast.LENGTH_SHORT)
.show();
break;
}
item.setIcon(R.drawable.select_all);
selectAllContacts();
}
break;
case R.id.delete_item: // 刪除
if (count == 0) {
Toast.makeText(this, "您還沒有選擇任何聯(lián)系人", Toast.LENGTH_SHORT).show();
break;
}
showDeleteDialog(this, "您確定要?jiǎng)h除嗎");
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) {// 如果是會(huì)議
fresh_intent.putExtra("number", meetingNumber);
}
startActivityForResult(fresh_intent, CLOUD_SYNC);
break;
default:
break;
}
return false;
}
// 刷新菜單項(xiàng)全選
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);
}
}
提示刪除的對(duì)話框
/** 顯示確認(rèn)刪除對(duì)話框 **/
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();
}
下面是刪除操作:
這里只關(guān)注實(shí)現(xiàn)刪除的脈路,其中有些代碼是業(yè)務(wù)邏輯需要可以稍微看一下就可以了
// 刪除選中的聯(lián)系人
public void deleteContacts() {
DialogHelp.getInstance().showHttpDialog(this, R.string.wait_for_while,
getString(R.string.deleting_contact));
new Thread() {
@Override
public void run() {
ArrayList<Contact> deleteContacts = new ArrayList<Contact>();
for (Contact contact : contactList) {
boolean isselected = map_NumberSelected
.get(contact.getId());
if (isselected) {
for (RawContact rawContact : rawList) {
if (contact.getUserId() == rawContact.getUserId()) { // 是同一個(gè)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;
}
}
// 將需要?jiǎng)h除的聯(lián)系人保存下來
deleteContacts.add(contact);
}
}
Message msg = new Message();
msg.obj = deleteContacts;
msg.what = DELETE_COMPLETE;
handler.sendMessage(msg);
};
}.start();
}
deleteContacts是用來保存需要?jiǎng)h除的聯(lián)系人,把它賦給msg.obj,再通過handler將消息放入消息隊(duì)列,最終在handler的handleMessage方法進(jìn)行刪除操作。
handler處理代碼:
這里把傳遞過來list在contactList遍歷刪除,然后在msg.what為DELETE_COMPLETE的分支進(jìn)行通知列表刷新。
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.obj != null) {
ArrayList<Contact> deleteContacts = (ArrayList<Contact>) 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;
}
}
};
以上就是刪除功能的全部實(shí)現(xiàn)了,關(guān)于通訊錄模塊開發(fā)博客可能會(huì)暫停更新,比如想字母索引,聯(lián)系人分組等功能我還沒去實(shí)現(xiàn),以后有機(jī)會(huì)會(huì)繼續(xù)分享。
- 使用adb命令向Android模擬器中導(dǎo)入通訊錄聯(lián)系人的方法
- Android獲取手機(jī)通訊錄、sim卡聯(lián)系人及調(diào)用撥號(hào)界面方法
- Android個(gè)人手機(jī)通訊錄開發(fā)詳解
- Android實(shí)現(xiàn)通訊錄效果——獲取手機(jī)號(hào)碼和姓名
- Android讀取手機(jī)通訊錄聯(lián)系人到自己項(xiàng)目
- Android破解微信獲取聊天記錄和通訊錄信息(靜態(tài)方式)
- android仿微信通訊錄搜索示例(匹配拼音,字母,索引位置)
- Android自定義View實(shí)現(xiàn)通訊錄字母索引(仿微信通訊錄)
- Android實(shí)現(xiàn)仿通訊錄側(cè)邊欄滑動(dòng)SiderBar效果代碼
- Android Studio實(shí)現(xiàn)簡(jiǎn)單的通訊錄
相關(guān)文章
Android獲取設(shè)備CPU核數(shù)、時(shí)鐘頻率以及內(nèi)存大小的方法
這篇文章主要介紹了Android獲取設(shè)備CPU核數(shù)、時(shí)鐘頻率以及內(nèi)存大小的方法,涉及Android針對(duì)系統(tǒng)硬件相關(guān)操作技巧,需要的朋友可以參考下2016-07-07flutter 路由跳轉(zhuǎn)的實(shí)現(xiàn)示例
這篇文章主要介紹了flutter 路由跳轉(zhuǎn)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Android自定義View實(shí)現(xiàn)波浪動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)波浪動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08Android實(shí)現(xiàn)頁(yè)面滑動(dòng)切換動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)頁(yè)面滑動(dòng)切換動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android簡(jiǎn)易電話撥號(hào)器實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了Android簡(jiǎn)易電話撥號(hào)器實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07