怎样获取android手机联系人并按字母展示(一)
android提供了本地数据库的查询uri,能够查询出数据:
採用一个AsyncQueryHandler来进行查询, AsyncQueryHandler自己开启了线程来进行数据查询,非常方便
protected AsyncQueryHandler mQueryHandler;
protected final void queryPersonal() {
mQueryHandler.startQuery(QUERY_TOKEN, null, ContactsContract.Contacts.CONTENT_URI,
Personal.CONTACTS_SUMMARY_PROJECTION, null, null, getSortOrder(ContactsContract.Contacts.DISPLAY_NAME));
}
protected static String getSortOrder(String fieldName) {
//substr为截取函数。取第一个字母
//COLLATE主要用于对字符进行排
//COLLATE LOCALIZED 按本地语言进行排序
return "CASE WHEN substr(UPPER(" + fieldName + "), 1, 1) BETWEEN 'A' AND 'Z' THEN 1 else 10 END," +
fieldName + " COLLATE LOCALIZED ASC";
}
protected final class MyHandler extends AsyncQueryHandler {
/**
* Asynchronous query handler constructor.
*/
public MyHandler(Context context) {
super(context.getContentResolver());
}
/**
* On query completion.
*/
@Override
<strong>protected void onQueryComplete(int token, Object cookie, Cursor cursor) </strong>{ //handler查询完的回调
if (cursor == null || cursor.isClosed()) {
return;
}
if (!isFinishing()) {
setLoading(false);
if (mAdapter != null) {
mAdapter.setLoading(false);
mAdapter.changeCursor(cursor);
}
if (cursor.getCount() == 0) {
mEmtytext.setVisibility(View.VISIBLE);
} else {
mEmtytext.setVisibility(View.INVISIBLE);
}
} else {
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
}
}
}
这个Layout是:
<?xml version="1.0" encoding="utf-8"? >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:rcm="http://schemas.android.com/apk/res/com.ringcentral.android"
android:id="@+id/contact_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bgColorMain"
android:orientation="vertical"> <ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@android:color/transparent"
android:descendantFocusability="afterDescendants"
android:divider="@null"
android:fastScrollEnabled="true"
android:listSelector="@drawable/bg_list_item_selector" /> <RelativeLayout
android:id="@+id/no_contact_indication"
android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:id="@+id/emptyListText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:singleLine="true"
android:text="No Contacts"
android:textColor="@color/text_no_items"
android:textSize="20sp" /> <ProgressBar
android:id="@+id/loading"
style="@style/RCMProgressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone" />
</RelativeLayout> </LinearLayout>
然后是list adapter的写法:
protected static final class SectionedContactListItemCache {
public TextView sectionHeader;
public TextView nameView;
public TextView typeView;
public ImageView photoView;
public ImageView detailItemIcon;
<span style="white-space:pre"> </span>public View nameTypeWrapper;
}
protected final class ContactsAdapter extends ResourceCursorAdapter {
public ContactsAdapter(Context context) {
super(context, R.layout.contacts_list_item_photo,null);
}
@Override
public void changeCursor(Cursor c) {
super.changeCursor(c);
}
protected String getTitle(String displayName) {
String title;
/** check if the first letter is English letter */
Matcher matcher = mPattern.matcher(displayName);
if (!matcher.find()) {
title = NONE_ENGLISH_LETTER_TITLE;
} else {
title = displayName.trim().substring(0, 1).toUpperCase(Locale.US);
}
return title;
}
protected String getDisplayName(Cursor c) {
String displayName = c.getString(Personal.NAME_COLUMN_INDEX);
if(TextUtils.isEmpty(displayName)) {
return "";
}
return displayName;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
final SectionedContactListItemCache cache = (SectionedContactListItemCache) view.getTag();
cache.typeView.setVisibility(View.GONE);
cache.photoView.setVisibility(View.VISIBLE);
String name = cursor.getString(Personal.NAME_COLUMN_INDEX);
if (TextUtils.isEmpty(name)) {
cache.nameView.setText(R.string.contact_no_name);
} else {
cache.nameView.setText(name);
}
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = super.newView(context, cursor, parent);
final SectionedContactListItemCache cache = new SectionedContactListItemCache();
cache.nameTypeWrapper = view.findViewById(R.id.name_type);
cache.sectionHeader = (TextView) view.findViewById(R.id.txtSectionHeader);
cache.nameView = (TextView) view.findViewById(R.id.name);
cache.typeView = (TextView) view.findViewById(R.id.type);
cache.photoView = (ImageView) view.findViewById(R.id.photo);
cache.detailItemIcon = (ImageView) view.findViewById(R.id.contacts_detail_item_icon);
view.setTag(cache);
return view;
}
}//end of adapter
item adapter的layout:
<?xml version="1.0" encoding="utf-8"? >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"> <TextView
android:id="@+id/txtSectionHeader"
android:layout_width="match_parent"
android:layout_height="@dimen/list_item_section_height"
android:background="@drawable/bg_contacts_section_header"
android:gravity="center_vertical|left"
android:paddingLeft="@dimen/default_padding_to_side"
android:textColor="@color/contacts_text_separator_text_color"
android:textSize="@dimen/font_size_medium" /> <RelativeLayout
android:id="@+id/contact_item"
android:layout_width="match_parent"
android:layout_height="@dimen/general_list_view_item_height"> <ImageView
android:id="@+id/photo"
android:layout_width="@dimen/favorites_item_picture_width"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignWithParentIfMissing="true"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:layout_marginLeft="@dimen/contact_photo_margin_left_right"
android:scaleType="fitCenter"
/> <!-- this icon may be added in next version, and now it would be hidden --> <ImageView
android:id="@+id/contacts_detail_item_icon"
android:layout_width="50dip"
android:layout_height="60dip"
android:layout_alignParentRight="true"
android:layout_marginRight="0dip"
android:cropToPadding="true"
android:duplicateParentState="false"
android:paddingBottom="3dip"
android:paddingTop="3dip"
android:scaleType="fitCenter"
android:src="@drawable/ic_list_link"
android:visibility="gone" /> <RelativeLayout
android:id="@+id/name_type"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignWithParentIfMissing="true"
android:layout_toLeftOf="@id/contacts_detail_item_icon"
android:layout_marginLeft="@dimen/contact_photo_margin_left_right"
android:layout_toRightOf="@id/photo"
android:background="@drawable/bg_list_item_divider"> <TextView
android:id="@+id/type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/name"
android:layout_alignParentRight="true"
android:layout_marginRight="@dimen/contact_type_margin_left_right"
android:ellipsize="marquee"
android:gravity="center_vertical|right"
android:singleLine="true"
android:textColor="@color/refresh_control_text_color"
android:textSize="@dimen/font_size_small" /> <TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="@dimen/contact_name_margin_left_right"
android:layout_toLeftOf="@id/type"
android:ellipsize="marquee"
android:gravity="center_vertical|left"
android:singleLine="true"
android:textColor="@color/text_color_main"
android:textSize="@dimen/font_size_medium" />
</RelativeLayout>
</RelativeLayout> </LinearLayout>
怎样获取android手机联系人并按字母展示(一)的更多相关文章
- 怎样获取android手机联系人并按字母展示(三)
假设获取contact的头像信息并展示: 怎样依据photoId来获取bitmap: public static Bitmap getContactPhoto(Context context, lon ...
- 获取android手机联系人信息
package com.yarin.android.Examples_04_04; import android.app.Activity; import android.database.Curso ...
- 获取Android 手机屏幕宽度和高度以及获取Android手机序列号
1.获取Android 手机屏幕宽度 1 DisplayMetrics dm = new DisplayMetrics(); 2 this.getWindowManager().getDefaultD ...
- 关于Android的Build类——获取Android手机设备各种信息
经常遇到要获取Android手机设备的相关信息,来进行业务的开发,比如经常会遇到要获取CPU的类型来进行so库的动态的下载.而这些都是在Android的Build类里面.相关信息如下: private ...
- Pyqt adb 获取Android手机屏幕
adb的全称为Android Debug Bridge,就是起到调试桥的作用.adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会da ...
- 获取android手机基本信息
/** * 获取android当前可用内存大小 */ private String getAvailMemory() {// 获取android当前可用内存大小 ActivityManager am ...
- 如何获取Android手机的唯一标识
有很多场景和需求你需要用到手机设备的唯一标识符. 在Android中,有以下几种方法获取这样的ID. 1. The IMEI: 仅仅只对Android手机有效: 1 2 TelephonyManage ...
- (转)获取android手机内部存储空间和外部存储空间的参数 && 如何决定一个apk的安装位置
转:http://blog.csdn.net/zhandoushi1982/article/details/8560233 获取android文件系统的信息,需要Environment类和StatFs ...
- 如何获得android手机通讯录的字母显示(两)
随后的写如何使各第一字母显示相同的分类触点: 于adapter implement SectionIndexer 这项adapter必须在下面可以实现3接口: @Override public Obj ...
随机推荐
- 14.6.2 Moving or Copying InnoDB Tables to Another Machine 移动或者copy InnoDB 表到另外的机器
14.6.2 Moving or Copying InnoDB Tables to Another Machine 移动或者copy InnoDB 表到另外的机器 这个章节描述技术关于移动或者copy ...
- [Usaco2008 Feb]Meteor Shower流星雨
去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽, 届时将会对它撞到的一切东西造成毁灭性的打击 ...
- [C#基础] 泛型
为什么泛型? 在泛型中,最重要的应用便是集合类,因此我们模拟一个简单的集合类 对于上述示例,可以有如下应用 从上可看出,自定义的代码太丑陋了,只能用于string类型. 当然我们可以用object作为 ...
- python 内存泄露的诊断 - 独立思考 - ITeye技术网站
python 内存泄露的诊断 - 独立思考 - ITeye技术网站 python 内存泄露的诊断 博客分类: 编程语言: Python Python多线程Blog.net 对于一个用 python ...
- Linux内核驱动开发之KGDB原理介绍及kgdboe方式配置
接博文<Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)>.上篇博文中,仅简单介绍使用串口的Kgbd的流程(kgdboc方式),本文将重点介绍KGDB调试Linux内核的原 ...
- 给工程师的 10 条哲理(浅薄者迷信运气,强者相信因果,软件复制成本为零,文凭不重要,AWS使得创业成本为零,每个手机都是口袋里的强大电脑)
无论是主题分布式数据库,微服务,Soylent,尤伯杯,或者矮人要塞,我们试图从物质分离出来炒作,推迟叙事的客人.与尊重有软件工程日报的社论部分客观性. 一位渠道的成员说,“当软件工程每日的意见公布, ...
- HDU 2112 HDU Today(Dijkstra)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Time Limit: 15000/5000 MS (Java/Others ...
- Ubuntu下实现双屏独立切换
在编码时,总觉得屏幕大小不够,要是能多个屏多好,可以这样 把你的显示器连接到你的电脑,然后开启一个终端 输入:xrandr 显示如下: LVDS1 connected 1366x768+1024+0 ...
- 动态分析maillog日志,把恶意链接直接用防火墙禁止
近期用 postfix + dovecot 搭建了一个邮件server, 被人当做垃圾邮件转发器,经过配置postfix 的黑白名单, postfix 提示成功的 REJECT 了垃圾邮件, 只是还是 ...
- HDU 3571 N-dimensional Sphere(高斯消元 数论题)
这道题算是比较综合的了,要用到扩展欧几里得,乘法二分,高斯消元. 看了题解才做出来orz 基本思路是这样,建一个n*(n-1)的行列式,然后高斯消元. 关键就是在建行列式时会暴long long,所以 ...