Android通讯录开发之删除功能的实现方法
发布时间:2021-07-06 10:43:53
无论是Android开发或者是其他移动平台的开发,ListView肯定是一个大咖,那么对ListView的操作肯定是不会少的,上一篇博客介绍了如何实现全选和反选的功能,本篇博客介绍删除功能,删除列表中的项无谓就是及时刷新列表,这又跟UI线程扯上关系了,还是那句话,数据的更新通知一定要在UI线程上做,不然会出现各种错误,比如出现adapter数据源改变,但没有及时收到通知的情况。在执行遍历删除的时候,最好不要每删一个就直接通知,下面是我的实现方法,将需要删除的contact保存到一个List然后通过handler发生消息,然后再由handler来处理。
这里我顺带提一下菜单的实现
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为菜单图标
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<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()) { // 是同一个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<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;
}
}
};
以上就是删除功能的全部实现了,关于通讯录模块开发博客可能会暂停更新,比如想字母索引,联系人分组等功能我还没去实现,以后有机会会继续分享。
猜你喜欢
- 本文实例讲述了Java Web项目部署在Tomcat运行出错与解决方法。分享给大家供大家参考,具体如下:1、在部署Java Web项目的过程
- Java 8 Instant 时间戳用于“时间戳”的运算。它是以Unix元年(传统 的设定为UTC时区1970年1月1日午夜时分)开始 所经
- Java实现简单的类似QQ聊天工具,供大家参考,具体内容如下所使用到的知识点:java socket编程之TCP协议java Swing简单
- Java continue break 制作简单聊天室程序,屏蔽不文明语言,显示每句话聊天时间package com.swift;impor
- 本文实例为大家分享了Android ViewPager实现页面左右切换的具体代码,供大家参考,具体内容如下主界面viewpager.xml:
- java 算法之希尔排序一、思想 希尔排序:使数组中任意间隔为h的元素都是有序的。在进行排序的时候,如果h很大,我们就能将元素移动到很远的地
- 日期、数字格式化显示,是web开发中的常见需求,spring mvc采用XXXFormatter来处理,先看一个最基本的单元测试:packa
- # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了# 先看代码:public class Common {public static
- 在日常工作中,我们有时会需要修改字体的颜色来突出文本重点,让读者更容易抓住文章要点。在今天这篇文章中,我将为大家介绍如何以编程方式,在Wor
- 这篇文章主要介绍了简单了解Spring中BeanFactory与FactoryBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或
- 本文实例为大家分享了Java实现通讯录管理系统的具体代码,供大家参考,具体内容如下一、前言我们学了这么久的知识了,光学知识不会用是一件很悲伤
- 本文实例为大家分享了Unity打印机打印图片的具体代码,供大家参考,具体内容如下1、调用打印机首先就是要配置好打印机 就是电脑跟打印机已经连
- 迷宫项目实现设计文档项目介绍:一个网格迷宫由n行m列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示)。你的任务是找一
- 推荐阅读idea官网下载链接(对应版本号下载):https://www.jetbrains.com/idea/download/other.
- Java有一种特殊线程,守护线程,这种线程优先级特别低,只有在同一程序中的其他线程不执行时才会执行。由于守护线程拥有这些特性,所以,一般用为
- 前言说到对集合去重处理,第一时间想到的肯定是Linq的Distinct扩展方式,对于一般的值类型集合去重,很好处理,直接list.Disti
- java 中模式匹配算法-KMP算法实例详解朴素模式匹配算法的最大问题就是太低效了。于是三位前辈发表了一种KMP算法,其中三个字母分别是这三
- 日常的开发中经常会需要用到自定义View,这次刚好有个需求,需要用到带有节点的进度条。东西很简单直接继承View就行了。首先定义一些需要的属
- springboot配置mysql数据库spring.datasource.url报错spring.datasource.url=jdbc:
- 一,功能介绍本点单系统主要是基于SpringBoot框架和小程序开发的,主要是为当代人们的生活提供更便利、更高效的服务,也为营销者提供更好的