放假期间想要写一些博客了,算是开博了吧,从android开发开始吧,以后慢慢的把做过的一些项目中的知识点整理及算法的心得写到博客上。
进入正题,本篇博客的目的是写一个通讯录,可以扫描到系统内置数据库,并提供搜索功能,以及根据联系人字母或拼音通过右方导航条导航到联系人,并提供联系人导出功能,这个功能的添加也是因为我要格式化我的手机一次,但是要备份的需求添加进去的。
整体代码我会在文末给出链接.
我也参考了网上的一些代码,但是很少有能实现功能的,原因可能是代码比较老了,无法实现效果的原因,我将代码更新并且加入了一些新的功能,具体功能如下:
- 检索手机存入联系人并显示
- 右侧导航条根据拼音字母检索联系人
- 通过搜索栏实时搜索联系人
- vCard格式导出并发送分享功能
- 检测系统通讯录是否有变化,有变化在通知栏通知,并更新联系人列表功能
用到如下知识点:
- 自定义listview的实现(使用开源项目indexableListView,我们主要来分析这个listview)
- 调用android联系人数据库并进行排序
- 自定义dialog
- ...
由于用到开源项目indexableListView,我们可以先把代码下载下来放到我们的项目中,在github上下载:点击打开链接
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/top"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="@drawable/top_background"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<Button
android:id="@+id/btnExported"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:background="@drawable/search_btn_background"
android:gravity="center"
android:text="导出"
android:textSize="12sp"
android:textStyle="bold" />
<RelativeLayout
android:id="@+id/rlSearchFrameDelete"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/btnExported"
android:gravity="center_vertical">
<EditText
android:id="@+id/etSearch"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:background="@drawable/search_frame"
android:hint="请输入文字..."
android:paddingLeft="32dp"
android:singleLine="true"
android:textSize="12sp" />
<ImageView
android:id="@+id/ivDeleteText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerInParent="true"
android:paddingRight="20dp"
android:src="@drawable/delete"
android:visibility="gone" />
</RelativeLayout>
</RelativeLayout>
<com.woozzu.android.widget.IndexableListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
其中ivDeleteText是只点击edittext文本框后如果想把文本框中文字全部清除的时候点击的图标,开始为隐藏状态,当有文字输入时才会显示出来.
下面是本项目的联系人模型类:包括联系人姓名(contact_name),联系人索引key(sortKey),联系人号码(contact_phone),联系人id(contect_id)及联系人email(email),如果大家有其它想要展示的属性,可以添加在里面
package com.woozzu.android.model;
/**
* Created by han on 15-11-27.
*/
public class ContactMember {
private String contact_name;
private String sortKey