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. 进击的Hybrid App,量身定做缓存机制

    引用张图,简单粗俗的解释下 Native App.Web App 和 Hybrid App Navtie App: 使用平台系统提供的原生语言来编写的 App,如果Android用java,ios用o ...

  2. Javascript设计模式之创建构造函数和方法

    构造函数和方法 var Book = function (isbn,title,author) { this.setIsbn(isbn); this.setTitle(title); this.set ...

  3. Android网络编程系列 一 TCP/IP协议族

    在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...

  4. 【浏览器渲染原理】渲染树构建之渲染树和DOM树的关系(转载 学习中。。。)

    在DOM树构建的同时,浏览器会构建渲染树(render tree).渲染树的节点(渲染器),在Gecko中称为frame,而在webkit中称为renderer.渲染器是在文档解析和创建DOM节点后创 ...

  5. JAVA EE 第一阶段考试

    在第一阶段中我们学习了Spring Struts2 Hibernate.虽然在外面的公司中,公司项目的框架中都不在使用Struts2了.他好像出现了不可修复的bug.但是在学校,依然还是要学习这个.在 ...

  6. python中用filter求素数

    #用filter求素数 #生成器,生成一个无限序列 def _odd_iter(): n=1 while True: n=n+2 yield n #筛选函数 def _not_divisible(n) ...

  7. java源程序---可执行文件(.exe)----安装包

    众所周知,java源程序都可以导出为(executable jar file)可执行的.jar文件,但是该.jar文件需要在jre环境下才能执行. 那么如何能在没有装jre的电脑上运行呢?(那就要顺带 ...

  8. TCP拥塞控制

    TCP必须使用端到端拥塞控制而不是使网络辅助的拥塞控制,因为IP层不向端系统提供显式的网络拥塞反馈.TCP采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率. 几个相关 ...

  9. JavaScript设计模式与开发实践 - 单例模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返 ...

  10. linux删除文件未释放空间问题处理

    linux删除文件未释放空间问题处理 或者 /根分区满了 (我的根分区是/dev/sda1,/dev/sda1满了) http://blog.csdn.net/donghustone/article/ ...