根据联系人姓名首字符顺序读取通讯录

package com.zzw.contacts;

import java.util.ArrayList;

import android.app.ListActivity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.activity_main);

        ArrayList<Contact> contacts = new ArrayList<Contact>();
        readContacts(contacts);

        ListView listView = this.getListView();

        ArrayAdapter<Contact> adapter = new MyAdapter(this, android.R.layout.simple_list_item_2, contacts);
        listView.setAdapter(adapter);
    }

    private class MyAdapter extends ArrayAdapter<Contact> {

        private int resource;
        private LayoutInflater inflater;
        private ArrayList<Contact> contacts;

        public MyAdapter(Context context, int resource, ArrayList<Contact> contacts) {
            super(context, resource, contacts);
            this.resource = resource;
            this.contacts = contacts;
            inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
            return contacts.size();
        }

        @Override
        public Contact getItem(int position) {
            return contacts.get(position);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            if (convertView == null) {
                convertView = inflater.inflate(resource, null);
            }

            Contact contact = getItem(position);

            TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
            TextView text2 = (TextView) convertView.findViewById(android.R.id.text2);

            // 首字符,分组的依据
            text1.setText(contact.firstLetterOfName());

            // 详情
            text2.setText(contact.name + "" + contact.getPhoneNumbers());
            return convertView;
        }

    }

    // 读取设备联系人的一般方法。大致流程就是这样,模板化的操作代码。
    private void readContacts(ArrayList<Contact> contacts) {
        Uri uri = Uri.parse("content://com.android.contacts/contacts");
        ContentResolver resolver = this.getContentResolver();

        // 在这里我们给query传递进去一个SORT_KEY_PRIMARY
        // 告诉ContentResolver获得的结果按照联系人名字的首字母有序排序
        Cursor cursor = resolver.query(uri, null, null, null,
                android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);

        while (cursor.moveToNext()) {
            // 联系人id
            String id = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));
            // Sort key,读取的联系人按照姓名从 A->Z 的排序分组
            String sork_key_primary = cursor
                    .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));
            // 获取联系人姓名
            String name = cursor
                    .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));

            Contact mContact = new Contact();
            mContact.id = id;
            mContact.sort_key_primay = sork_key_primary;
            mContact.name = name;

            // 获取联系人的手机号码
            Cursor phone = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null);
            // 取得电话号码(可能存在多个号码)
            // 因为在同一个名字下,用户可能存有一个以上号码
            // 遍历
            ArrayList<String> phoneNumbers = new ArrayList<String>();
            while (phone.moveToNext()) {
                int phoneFieldColumnIndex = phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                String phoneNumber = phone.getString(phoneFieldColumnIndex);
                phoneNumbers.add(phoneNumber);
            }

            mContact.phoneNumbers = phoneNumbers;
            contacts.add(mContact);
        }
    }

    // 用于装载从联系人数据库中读取到的数据。
    // 结构化数据,便于数据操作和访问。
    private class Contact {
        public String id;
        public String name;
        public String sort_key_primay;
        public ArrayList<String> phoneNumbers;

        // 获得一个联系人名字的首字母。
        // 比如一个人的名字叫做“安卓”,那么这个人的首字母是:A
        public String firstLetterOfName() {
            String s = sort_key_primay.charAt(0) + "";

            return s.toUpperCase();
        }

        public String getPhoneNumbers() {
            String phones = "";
            for (int i = 0; i < phoneNumbers.size(); i++) {
                phones += ":     " + phoneNumbers.get(i);
            }
            return phones;
        }
    }
}

权限:

1 <!-- 写权限 -->
2     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
3     <!-- 读权限 -->
4     <uses-permission android:name="android.permission.READ_CONTACTS" />

xzylx1
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
写文章

热门文章

  • 通过JAVA代码获取手机的一些基本信息(本机号码,SDK版本,系统版本,手机型号) 7050
  • 通过Eclipse创建SQLite数据库 6044
  • RecyclerView中显示不同的item 5815
  • 将Tab栏居中的方法 5069
  • Eclipse使用ButterKnife前,需要的配置步骤 2621

最新评论

  • 二级下拉列表菜单ExpandTabViews(仿团购app)

    klq0551: 打开选择弹窗,置顶了,怎么解决?

  • 水面波浪形View--第三方开源--WaveView(电量、能量、容量指示)

    copy_code: 请问waveview可以做为父类控件往里面放自控件吗?

  • 水面波浪形View--第三方开源--WaveView(电量、能量、容量指示)

    copy_code: 请问waveview可以做为父类控件往里面放自控件吗

  • 水面波浪形View--第三方开源--WaveView(电量、能量、容量指示)

    copy_code: 请问waveview可以做为父类控件往里面放自控件吗

  • 点击后弧形展开的炫酷菜单--第三方开源-- CircularFloatingActionMenu(一)

    chaozhidan: 楼主,子菜单点击事件怎么实现啊

最新文章

  • Android之shape与selector实现圆角
  • Android高级模糊技术
  • 二级下拉列表菜单ExpandTabViews(仿团购app)
2016年3篇
2015年162篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

两个鬼故事四字酒水公司起名大全双胎男宝宝起名字大全建筑物抗震构造详图起名字男孩垂帘听政电影颇负盛名网络投资名副其实的意思给起名姓罗木命咋起名字鼠标点击精灵天邪鬼青哪里多周星驰粤语火焰山历险记酒水起名柯子起名免费宝宝起名高跟鞋视频御姐玫瑰文明6破解美业公司起名两个字光遇禁阁先祖位置姓罗孩子起名起名网免音乐号起名海伦凯勒简介机器人机构起名2021牛年吴姓起名代理名字怎么起白居易忆江南少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

两个鬼故事 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化