package com.lixu.tongxunlu;

 import java.util.ArrayList;
import com.lixu.tongxunlu.PinnedSectionListView.PinnedSectionListAdapter;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Color;
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.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.TextView; public class MainActivity extends Activity {
private ArrayList<Contacts> contacts;
private ArrayList<Data> data; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 去掉标题头
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
// 设置程序全屏
toggleFullscreen(true); data = new ArrayList<Data>();
contacts = new ArrayList<Contacts>();
// 获取手机联系人后装到contacts中
getcontacts(contacts); int A = (int) 'A';
for (int i = 0; i < 26; i++) {
int letter = A + i;
char c = (char) letter; Data group = new Data(); group.type = Data.GROUP;
group.text = c + "";
data.add(group);
for (int j = 0; j < contacts.size(); j++) {
Contacts cc = contacts.get(j);
String ss = cc.firstLetterofNmae();
// 判断联系人名字首字母是否和组名字母一样,一样后加入本组
if (ss.equals(group.text)) {
Data child = new Data();
child.type = Data.CHILD;
child.text = cc.name + "" + cc.getPhoneNumbers();
child.contacts = cc;
data.add(child);
} } } PinnedSectionListView pslv = (PinnedSectionListView) findViewById(R.id.pslv); pslv.setAdapter(new MyAdapter(this, -1)); pslv.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 判断点击子菜单才会触发点击事件
if (data.get(position).type == Data.CHILD) {
Data datas = data.get(position);
Contacts contact = datas.contacts;
// 获取电话号码
String number = contact.getPhoneNumbers(); Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number));
startActivity(intent);
}
}
}); } // 设置程序全屏的方法
public void toggleFullscreen(boolean fullScreen) {
// fullScreen为true时全屏 WindowManager.LayoutParams attrs = getWindow().getAttributes(); if (fullScreen) {
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
} else {
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
} getWindow().setAttributes(attrs);
} private class Data {
public static final int GROUP = 0;
public static final int CHILD = 1;
public static final int STYE = 2;
public String text;
public int type;
public Contacts contacts = null; } private class MyAdapter extends ArrayAdapter implements PinnedSectionListAdapter {
private LayoutInflater flater; public MyAdapter(Context context, int resource) {
super(context, resource);
flater = LayoutInflater.from(context);
} @Override
public int getCount() {
return data.size();
} @Override
public Object getItem(int position) {
return data.get(position);
} @Override
public int getItemViewType(int position) {
return data.get(position).type;
} @Override
public int getViewTypeCount() {
return Data.STYE;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
Data data = (Data) getItem(position);
switch (type) {
case Data.GROUP:
if (convertView == null)
convertView = flater.inflate(android.R.layout.simple_list_item_1, null); TextView tv = (TextView) convertView.findViewById(android.R.id.text1);
tv.setBackgroundColor(Color.GREEN);
tv.setTextSize(35);
tv.setText(data.text); break; case Data.CHILD:
if (convertView == null)
convertView = flater.inflate(android.R.layout.simple_list_item_1, null); TextView tv1 = (TextView) convertView.findViewById(android.R.id.text1);
tv1.setTextSize(20);
tv1.setText(data.text); break; default:
break;
}
return convertView;
} @Override
public boolean isItemViewTypePinned(int viewType) {
boolean type = false;
switch (viewType) {
case Data.CHILD: type = false; break; case Data.GROUP: type = true; break; default:
break;
}
return type;
} } // 获取手机联系人的方法
private void getcontacts(ArrayList<Contacts> 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));
// 将联系人按姓名首字母分组
String sort_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));
Contacts mContacts = new Contacts();
mContacts.id = id;
mContacts.name = name;
mContacts.sort_key_primary = sort_key_primary;
// 获取联系人手机号码
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);
}
mContacts.phonenumbers = phonenumbers;
contacts.add(mContacts); }
} private class Contacts {
public String id;
public String name;
public String sort_key_primary;
public ArrayList<String> phonenumbers; // 获取汉字首字母转换成大写字母
public String firstLetterofNmae() {
String s = sort_key_primary.charAt(0) + "";
return s.toUpperCase(); } public String getPhoneNumbers() {
String phones = "";
for (int i = 0; i < phonenumbers.size(); i++) {
phones += ":" + phonenumbers.get(i);
}
return phones; }
} }

xml文件:

不要忘记添加各种权限。

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp" > <com.lixu.tongxunlu.PinnedSectionListView
android:id="@+id/pslv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> </RelativeLayout>

效果示例图:

获取手机通讯录放入PinnedSectionListView中,按名字首字母排序,并且实现拨打电话功能。的更多相关文章

  1. mysql、oracle 中按照拼音首字母排序

    mysql中按照拼音首字母排序 convert(name using gbk) ASC 注:name 为字段名称 oracle中按照拼音首字母排序 nlssort(enterprise_name,'N ...

  2. 联系人的侧边字母索引ListView 将手机通讯录姓名通过首字母排序。

      package com.lixu.letterlistview; import java.util.ArrayList; import java.util.List; import org.apa ...

  3. java通过文件路径读取该路径下的所有文件并将其放入list中

    java通过文件路径读取该路径下的所有文件并将其放入list中   java中可以通过递归的方式获取指定路径下的所有文件并将其放入List集合中.假设指定路径为path,目标集合为fileList,遍 ...

  4. .Net中把图片等文件放入DLL中,并在程序中引用

    原文:.Net中把图片等文件放入DLL中,并在程序中引用 [摘要] 有时我们需要隐藏程序中的一些资源,比如游戏,过关后才能看到图片,那么图片就必须隐藏起来,否则不用玩这个游戏就可以看到你的图片了,呵呵 ...

  5. iOS中获取本地通讯录联系人以及汉字首字母排序

    iOS中获取手机通讯录中的联系人信息: /*** 加载本地联系人*/ - (void)loadLocalContacts { //新建一个通讯录类 ABAddressBookRef addressBo ...

  6. set是无序集合,放入set中的元素通过iterator输出时候是无序的

    set是无序集合,放入set中的元素通过iterator输出时候是无序的 HashMap<String , String> hashMap = new HashMap<String ...

  7. tuple放入dict中

    tuple放入dict中是否可以正常运行 # 将tuple放入dict中 a = ('AI','Kobe','Yao') b = ('AI',['Kobe','Yao']) dict1 = {'a': ...

  8. 在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可

    在查询时将查询条件放入Session中,导出时直接根据qpniRGaFiler取查询条件即可

  9. 用MT.exe将exe中的manifest文件提取出来和将manifest文件放入exe中

     前一种方法是将manifest文件放入exe中,但是要记得需要在工程中设置 这样的话exe中就不存在manifest了,在debug目录下就会看到相应的manifest文件.后者是将exe中的man ...

随机推荐

  1. Windows_cmd_命令

    1. netstat -ano  查看端口占用情况 netstat -anp // 命令来查看一下,Linux系统是否在监听 3306 这个端口号 2.

  2. OpenERP QWeb模板标签笔记

    在OpenERP中,通过QWeb来对模板进行渲染后加载到浏览器中,而模板中有许多的标签来定制各种需求变化,在这里记录学习过程中碰到的标签定义,以方便查询. 模板中的标签统一都是以"t-&qu ...

  3. css处理浏览器兼容问题

    浏览器的兼容: _ ie6认识 格式:_width:100px;要写在最后面来覆盖前面的. * ie6和ie7都认识 格式:* width:100px;要写在最后面来覆盖前面的. \0 ie8认识  ...

  4. jquery实现全选、反选、不选

    <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8&quo ...

  5. C++—函数

    一.函数的基本知识 要使用C++函数,必须完成一下工作: (1)提供函数定义: (2)提供函数原型: (3)调用函数. 1.定义函数 可以将函数分为两类,有返回值的函数和没有返回值的函数.没有返回值的 ...

  6. VirtualBox的网络配置,Host Only+NAT方式 (zhuan)

    http://blog.csdn.net/xinghun_4/article/details/7969894 ***************************************** 其实网 ...

  7. hiho1091_clicker背包问题

    问题 类似有限背包问题,题目链接:clicker 实现 #include<stdio.h> #include<cmath> #include<iostream> # ...

  8. PC-1500与PC通讯

    目录 第1章说明    2 第2章音频通讯    3 2.1 下载    3 2.2 上传    8 2.2.1 操作    8 2.2.2 音量    8 2.3 直接将BASIC代码转换为wav文 ...

  9. UIStepper

    @在IOS5中增加了一个UIStepper的新控件,UIStepper可以连续增加或减少一个数值.控件的外观是两个水平并排的按钮构成,一个显示为“+”,一个显示为“-”. 1. 初始化控件 UISte ...

  10. JavaScript的IIFE(即时执行方法)

    (1)标准写法 (function (window, document, undefined) { // })(window, document); (2)作用域Scope JavaScript有fu ...