在第二篇博客中http://blog.csdn.net/cmdkmd/article/details/8731217

按照那种方式查询,虽说效率高了些,但是在有些机型上,并不能按照系统联系人那样显示,没有办法只能采用官方的给出的办法

1 我的做法是预读取,在应用启动的时候就将读取联系人数据,然后放到application中,这样在内存中读取的非常快

2 遍历中嵌套遍历,频繁开关cursor,导致很慢,求大能指点


package com.xzq.contacttest;import java.util.ArrayList;import android.app.ListActivity;import android.content.AsyncQueryHandler;import android.content.ContentResolver;import android.database.Cursor;import android.os.Bundle;import android.provider.ContactsContract;import android.provider.ContactsContract.CommonDataKinds.Phone;import android.view.Window;import android.widget.ListView;public class MainAty extends ListActivity {    private ListView listView;    private ContactAdapter contactAdapter;    private AsyncQueryHandler asyncQuery;// 异步查询框架    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.main);        listView = getListView();        asyncQuery = new MyAsyncQueryHandler(getContentResolver());        String[] projection = { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, };        asyncQuery.startQuery(0, null, ContactsContract.Contacts.CONTENT_URI, projection, null, null, null);    }    private class MyAsyncQueryHandler extends AsyncQueryHandler {        public MyAsyncQueryHandler(ContentResolver cr) {            super(cr);        }        @Override        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {            switch (token) {            case 0:// 查询联系人                if (cursor != null && cursor.getCount() > 0) {                    ArrayList<Contact> list = new ArrayList<Contact>();                    while (cursor.moveToNext()) {                        Contact cb = new Contact();                        cb.contactId = cursor.getString(0);                        cb.name = cursor.getString(1);// 联系人姓名                        String[] projection = { Phone.DATA1 }; // 查询的列                        Cursor phones = getContentResolver().query(Phone.CONTENT_URI, projection,                                Phone.CONTACT_ID + " = " + cb.contactId, null, null);                        while (phones.moveToNext()) {                            cb.number = phones.getString(0);                            cb.listNumber.add(cb.number);                        }                        phones.close();                        list.add(cb);                    }                    contactAdapter = new ContactAdapter(MainAty.this, list);                    listView.setAdapter(contactAdapter);                }                break;            }            cursor.close();        }    }}

源码 : http://download.csdn.net/detail/cmdkmd/5219513


更多相关文章

  1. Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录
  2. 解剖Android联系人之一,基于2.1
  3. Android(安卓)6.0权限请求相关及权限分组
  4. Android中Fragment嵌套生命周期响应问题
  5. Android(安卓)切换主题demo
  6. Android(java)学习笔记89:泛型概述和基本使用
  7. Android(安卓)TestView获取每一行文字的方法
  8. Android(安卓)API Guides---Contacts Provider
  9. Android(安卓)ListView实现快速定位联系人功能【转发】

随机推荐

  1. 四大组件之一 ----------- BroadcastRece
  2. Android实现记事本功能(26)
  3. Android:TextView自定义删除线
  4. android跳到手机home键主界面
  5. Android三种左右滑动效果 手势识别
  6. Android Activity onPause与onStop
  7. Android获取SIM卡信息--TelephonyManager
  8. rename application package 遇到的excep
  9. android一些网址,其实两个就基本够用了
  10. Android中的软引用、弱引用