实现对手机联系人列表进行读写操作,并用RecyclerView收缩展开方式展现

在之前做的类微信界面上加了显示手机联系人,姓名,电话,邮箱三项信息的功能,同时可以添加联系人同步到手机联系人记录中,添加完下拉刷新显示。

完整的项目代码

在Android中,如果想把A应用的数据库增加一个共享方式,就为A应用写一个ContentProvider方法,标识B应用要访问的数据。然后通过ContentResolver的增删改查方法实现对数据的共享操作。而读写手机联系人的ContentResolver方法直接调用即可。

获取数据存到自定义数据类型里的方法

 public void showlist(){dataBeanList = new ArrayList<>();Cursor cursor = getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);while(cursor.moveToNext()){String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));dataBean = new DataBean();dataBean.setID(contactId);dataBean.setType(0);dataBean.setChildBean(dataBean);dataBean.setParentLeftTxt("Name:"+name);Cursor phones = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId,null,null);while(phones.moveToNext()){String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));dataBean.setChildLeftTxt("MobilePhone:"+phoneNumber);}phones.close();Cursor emails = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null);while (emails.moveToNext()){// 获取查询结果中E-mail地址列中数据String emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));dataBean.setChildRightTxt("Email:"+emailAddress);}emails.close();dataBeanList.add(dataBean);}cursor.close();}

相比较之前写的RecyclerView收缩展开静态数据的方式,这次展现的数据是动态的。所以新建了个数据类,用于对手机联系人姓名,号码,邮箱的获取/赋值。由于数据是展开,收缩的形式,便为一级列表和二级列表各写了相应的ViewHolder,两者继承相同的父类。

添加数据功能的思路,在点击添加按钮后出现一个弹框,用EditText接收输入的信息。

final View view1 = getLayoutInflater().inflate(R.layout.addcontact, null);new AlertDialog.Builder(MainActivity.this).setTitle("添加手机联系人信息").setView(view1).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int which) {et_name = (EditText)view1.findViewById(R.id.et_name);et_phone = (EditText)view1.findViewById(R.id.et_phone);et_email=(EditText)view1.findViewById(R.id.et_email);String name = et_name.getText().toString();final  String phone = et_phone.getText().toString();final  String email = et_email.getText().toString();// 创建一个空的ContentValuesContentValues values = new ContentValues();// 向RawContacts.CONTENT_URI执行一个空值插入// 目的是获取系统返回的rawContactIdUri rawContactUri = getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values);long rawContactId = ContentUris.parseId(rawContactUri);values.clear();values.put(Data.RAW_CONTACT_ID, rawContactId);// 设置内容类型values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);// 设置联系人名字values.put(StructuredName.GIVEN_NAME, name);// 向联系人URI添加联系人名字getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);values.clear();values.put(Data.RAW_CONTACT_ID, rawContactId);values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);// 设置联系人的电话号码values.put(Phone.NUMBER, phone);// 设置电话类型values.put(Phone.TYPE, Phone.TYPE_MOBILE);// 向联系人电话号码URI添加电话号码getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);values.clear();values.put(Data.RAW_CONTACT_ID, rawContactId);values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);// 设置联系人的E-mail地址values.put(Email.DATA, email);// 设置该电子邮件的类型values.put(Email.TYPE, Email.TYPE_WORK);// 向联系人E-mail URI添加E-mail数据getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);}}).show();

最初没有写刷新功能,添加完后得重新进入应用才能显示,于是参照刷新布局控件
SwipeRefreshLayout的使用方法,加了个下拉刷新的功能。

布局文件

    <android.support.v4.widget.SwipeRefreshLayoutandroid:id="@+id/srl"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v7.widget.RecyclerViewandroid:id="@+id/rcv_expandcollapse"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="8dp"android:overScrollMode="never"android:scrollbars="none"/></android.support.v4.widget.SwipeRefreshLayout>

刷新部分的实现

 private SwipeRefreshLayout msrl;msrl = view.findViewById(R.id.srl);msrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {new Handler().postDelayed(new Runnable() {@Overridepublic void run() {showlist();setData();msrl.setRefreshing(false);}},1200);}});

实现效果如下

这次遇到了大大小小很多错误,其中最令人深刻的是下面这个空指针异常的错误。

错误部分的代码如下

 case R.id.id_add_contact:final View view1 = getLayoutInflater().inflate(R.layout.addcontact, null);new AlertDialog.Builder(MainActivity.this).setTitle("添加手机联系人信息").setView(view1).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int which) {et_name = (EditText)view1.findViewById(R.id.et_name);et_phone = (EditText)view1.findViewById(R.id.et_phone);et_email=(EditText)view1.findViewById(R.id.et_email);

最后找到了原因是我实例化EditText时,没有加view1,导致我在处理这个错误上花了很多时间。最后查找了关于findViewById的解释,才明白,findViewById默认上下文是在Activity的主布局中,在子布局,如弹窗Dialog中,要用view.findViewById方法才行。

实现对手机联系人列表进行读写操作,并用RecyclerView收缩展开方式展现相关推荐

  1. java 获取手机联系人_Android 读取手机联系人、拨号、发送短信及长按菜单的操作...

    本示例实现了读取手机联系人,拨号.发送短信及长按出现菜单选项的操作↓ 1.Andrid项目结构图↓主要操作图中红色方框内的文件. 2.首先布局代码如下↓ a, main.xml 程序运行的主界面,主要 ...

  2. Android 保存号码至已有联系人,新建联系人,读取手机联系人

    添加必要的权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> & ...

  3. java 添加手机联系人_Android编程实现读取手机联系人、拨号、发送短信及长按菜单操作方法实例小结...

    本文实例讲述了Android编程实现读取手机联系人.拨号.发送短信及长按菜单操作方法.分享给大家供大家参考,具体如下: 1.Andrid项目结构图↓主要操作图中红色方框内的文件. 2.首先布局代码如下 ...

  4. 苹果手机怎么备份所有数据_数据蛙:微信怎么备份手机通讯录,随时备份和恢复手机联系人!...

    微信怎么备份手机通讯录.在日常生活中,许多人都会换手机或者卸载微信,但重新下载微信后又想用以前的通讯录,所以如何备份微信通讯录呢. 微信能备份手机通讯录吗? 实际上,目前微信上通讯录助手功能已经下线. ...

  5. ESET最近发现了一款新的Android勒索软件,它通过向受害者的手机的联系人列表发送恶意短信继续传播

    最近ESET研究人员发现了一个新的Android勒索软件家族,它们试图通过向受害者的手机的联系人列表发送恶意短信继续传播. 在Android勒索软件遭遇两年的衰退之后,一个新的Android勒索软件家 ...

  6. Android Studio 获取手机联系人并进行,发短信,打电话,增删改操作

    1.总体设计 我的整体功能设计相对简单.一个主要的联系人显示界面,使用ListView将得到联系人数据进行显示,通过点击,长按联系人事件触发相应的弹窗(Dailog)然后选择想要的功能.通过点击加号图 ...

  7. 《统一沟通-微软-技巧》-20-Lync 2010如何在我的联系人列表中添加非联盟联系人...

    Blog:http://dynamic.blog.51cto.com MSN:LiuJinFeng@msn.com QQ:316190099 如果加: A. 内部Lync用户: 输入-英文名 输入-中 ...

  8. golang与手机如何实现一些自动化操作?

    所有指令控制: http://adbshell.com/ golang与手机如何实现一些自动化操作?虽然不太会把电脑开起来操作手机,不过pi也应该可以与手机互动吧. 比如说来个无人值守功能啥的,语音信 ...

  9. 基于Python的Excel读写操作--内容超详细,值得排排坐

    今日份超详细的解读,Excel文件基础操作,让你以学就会. 写这个的原因是,一位群友问了很久,然后网上的教程写的又不是很详细,看的有些犯迷糊,所以我今日份写一份超详细的基本操作,让你打下良好的基础. ...

最新文章

  1. DNS迭代式和递归式域名查询对比
  2. 能源枯竭?在能源互联网时代不存在!
  3. 读完《Effective Java》后,总结了 50 条开发技巧
  4. 如何保证数据库服务器的安全性
  5. 后端生成Token架构与设计详解
  6. Struts1.x的使用
  7. Linux / openwrt / Ubuntu 18.04 虚拟机中的 openwrt 如何联网
  8. STL源码剖析 序列式容器 vector 和 ilist
  9. [CF893F]Subtree Minimum Query
  10. C语言实例第8期:模拟银行账户登陆
  11. 计算机电脑五笔怎么打,卸五笔怎么打_电脑极品五笔输入法卸载方法介绍
  12. Kvaser新品推介:一款坚固耐用的单通道CAN / CAN FD转USB接口-Kvaser U100 编码:73-30130-01173-1
  13. masscan for windows windows编译masscan
  14. matlab 求隐含波动率,Matlab求解資产隐含波动率及无风险利率初探.doc
  15. 开环直流电机的机械特性_直流电机调速开环控制.docx
  16. git 查看远程分支、本地分支、创建分支、把分支推到远程repository、删除本地分支
  17. Java-数据结构:树,这份资料可帮你解决95%的问题
  18. Gatsby 学习 - 03 Gatsby 插件
  19. 大数据促进移动社交电商发展
  20. 专杀工具编写思路(转)

热门文章

  1. 周训练计划之(韦德分化训练法:胸、肩、背、腿、腹)
  2. 编程语言入门YC创始人Paul Graham:如何开始创业
  3. 计算机休眠快还是关机快,电脑关机、休眠、睡眠、快速启动模式的区别介绍
  4. 举个栗子!Tableau 技巧(152):横向对比堆叠柱形图的各部分占比
  5. 《LeetCode之每日一题》:148.回旋镖的数量
  6. EKL-日志收集系统安装
  7. Linux 下 TC 命令原理及详解<一>
  8. Mapper method 'comxx' has an unsupported return type
  9. electron+vue3+vite2 如何使用打印
  10. HTML特效代码汇总