1. package com.lixu.tongxunlu;
  2.  
  3. import java.util.ArrayList;
  4. import com.lixu.tongxunlu.PinnedSectionListView.PinnedSectionListAdapter;
  5. import android.app.Activity;
  6. import android.content.ContentResolver;
  7. import android.content.Context;
  8. import android.content.Intent;
  9. import android.database.Cursor;
  10. import android.graphics.Color;
  11. import android.net.Uri;
  12. import android.os.Bundle;
  13. import android.provider.ContactsContract;
  14. import android.view.LayoutInflater;
  15. import android.view.View;
  16. import android.view.ViewGroup;
  17. import android.view.Window;
  18. import android.view.WindowManager;
  19. import android.widget.AdapterView;
  20. import android.widget.AdapterView.OnItemClickListener;
  21. import android.widget.ArrayAdapter;
  22. import android.widget.TextView;
  23.  
  24. public class MainActivity extends Activity {
  25. private ArrayList<Contacts> contacts;
  26. private ArrayList<Data> data;
  27.  
  28. @Override
  29. protected void onCreate(Bundle savedInstanceState) {
  30. super.onCreate(savedInstanceState);
  31. // 去掉标题头
  32. requestWindowFeature(Window.FEATURE_NO_TITLE);
  33. setContentView(R.layout.activity_main);
  34. // 设置程序全屏
  35. toggleFullscreen(true);
  36.  
  37. data = new ArrayList<Data>();
  38. contacts = new ArrayList<Contacts>();
  39. // 获取手机联系人后装到contacts中
  40. getcontacts(contacts);
  41.  
  42. int A = (int) 'A';
  43. for (int i = 0; i < 26; i++) {
  44. int letter = A + i;
  45. char c = (char) letter;
  46.  
  47. Data group = new Data();
  48.  
  49. group.type = Data.GROUP;
  50. group.text = c + "";
  51. data.add(group);
  52. for (int j = 0; j < contacts.size(); j++) {
  53. Contacts cc = contacts.get(j);
  54. String ss = cc.firstLetterofNmae();
  55. // 判断联系人名字首字母是否和组名字母一样,一样后加入本组
  56. if (ss.equals(group.text)) {
  57. Data child = new Data();
  58. child.type = Data.CHILD;
  59. child.text = cc.name + "" + cc.getPhoneNumbers();
  60. child.contacts = cc;
  61. data.add(child);
  62. }
  63.  
  64. }
  65.  
  66. }
  67.  
  68. PinnedSectionListView pslv = (PinnedSectionListView) findViewById(R.id.pslv);
  69.  
  70. pslv.setAdapter(new MyAdapter(this, -1));
  71.  
  72. pslv.setOnItemClickListener(new OnItemClickListener() {
  73.  
  74. @Override
  75. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  76. // 判断点击子菜单才会触发点击事件
  77. if (data.get(position).type == Data.CHILD) {
  78. Data datas = data.get(position);
  79. Contacts contact = datas.contacts;
  80. // 获取电话号码
  81. String number = contact.getPhoneNumbers();
  82.  
  83. Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number));
  84. startActivity(intent);
  85. }
  86. }
  87. });
  88.  
  89. }
  90.  
  91. // 设置程序全屏的方法
  92. public void toggleFullscreen(boolean fullScreen) {
  93. // fullScreen为true时全屏
  94.  
  95. WindowManager.LayoutParams attrs = getWindow().getAttributes();
  96.  
  97. if (fullScreen) {
  98. attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
  99. } else {
  100. attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
  101. }
  102.  
  103. getWindow().setAttributes(attrs);
  104. }
  105.  
  106. private class Data {
  107. public static final int GROUP = 0;
  108. public static final int CHILD = 1;
  109. public static final int STYE = 2;
  110. public String text;
  111. public int type;
  112. public Contacts contacts = null;
  113.  
  114. }
  115.  
  116. private class MyAdapter extends ArrayAdapter implements PinnedSectionListAdapter {
  117. private LayoutInflater flater;
  118.  
  119. public MyAdapter(Context context, int resource) {
  120. super(context, resource);
  121. flater = LayoutInflater.from(context);
  122. }
  123.  
  124. @Override
  125. public int getCount() {
  126. return data.size();
  127. }
  128.  
  129. @Override
  130. public Object getItem(int position) {
  131. return data.get(position);
  132. }
  133.  
  134. @Override
  135. public int getItemViewType(int position) {
  136. return data.get(position).type;
  137. }
  138.  
  139. @Override
  140. public int getViewTypeCount() {
  141. return Data.STYE;
  142. }
  143.  
  144. @Override
  145. public View getView(int position, View convertView, ViewGroup parent) {
  146. int type = getItemViewType(position);
  147. Data data = (Data) getItem(position);
  148. switch (type) {
  149. case Data.GROUP:
  150. if (convertView == null)
  151. convertView = flater.inflate(android.R.layout.simple_list_item_1, null);
  152.  
  153. TextView tv = (TextView) convertView.findViewById(android.R.id.text1);
  154. tv.setBackgroundColor(Color.GREEN);
  155. tv.setTextSize(35);
  156. tv.setText(data.text);
  157.  
  158. break;
  159.  
  160. case Data.CHILD:
  161. if (convertView == null)
  162. convertView = flater.inflate(android.R.layout.simple_list_item_1, null);
  163.  
  164. TextView tv1 = (TextView) convertView.findViewById(android.R.id.text1);
  165. tv1.setTextSize(20);
  166. tv1.setText(data.text);
  167.  
  168. break;
  169.  
  170. default:
  171. break;
  172. }
  173. return convertView;
  174. }
  175.  
  176. @Override
  177. public boolean isItemViewTypePinned(int viewType) {
  178. boolean type = false;
  179. switch (viewType) {
  180. case Data.CHILD:
  181.  
  182. type = false;
  183.  
  184. break;
  185.  
  186. case Data.GROUP:
  187.  
  188. type = true;
  189.  
  190. break;
  191.  
  192. default:
  193. break;
  194. }
  195. return type;
  196. }
  197.  
  198. }
  199.  
  200. // 获取手机联系人的方法
  201. private void getcontacts(ArrayList<Contacts> contacts) {
  202. Uri uri = Uri.parse("content://com.android.contacts/contacts");
  203. ContentResolver resolver = this.getContentResolver();
  204. // 给query传递一个SORT_KEY_PRIMARY,让ContentResolver将获得的数据按照联系人名字首字母排序
  205. Cursor cursor = resolver.query(uri, null, null, null,
  206. android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);
  207. while (cursor.moveToNext()) {
  208. // 联系人的id
  209. String id = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));
  210. // 将联系人按姓名首字母分组
  211. String sort_key_primary = cursor
  212. .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));
  213. // 获取联系人的名字
  214. String name = cursor
  215. .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));
  216. Contacts mContacts = new Contacts();
  217. mContacts.id = id;
  218. mContacts.name = name;
  219. mContacts.sort_key_primary = sort_key_primary;
  220. // 获取联系人手机号码
  221. Cursor phone = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
  222. ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null);
  223. // 将获取到的号码遍历
  224. ArrayList<String> phonenumbers = new ArrayList<String>();
  225. while (phone.moveToNext()) {
  226. int phoneFieldColumnIndex = phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
  227. String phonenumber = phone.getString(phoneFieldColumnIndex);
  228. phonenumbers.add(phonenumber);
  229. }
  230. mContacts.phonenumbers = phonenumbers;
  231. contacts.add(mContacts);
  232.  
  233. }
  234. }
  235.  
  236. private class Contacts {
  237. public String id;
  238. public String name;
  239. public String sort_key_primary;
  240. public ArrayList<String> phonenumbers;
  241.  
  242. // 获取汉字首字母转换成大写字母
  243. public String firstLetterofNmae() {
  244. String s = sort_key_primary.charAt(0) + "";
  245. return s.toUpperCase();
  246.  
  247. }
  248.  
  249. public String getPhoneNumbers() {
  250. String phones = "";
  251. for (int i = 0; i < phonenumbers.size(); i++) {
  252. phones += ":" + phonenumbers.get(i);
  253. }
  254. return phones;
  255.  
  256. }
  257. }
  258.  
  259. }

xml文件:

不要忘记添加各种权限。

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:padding="10dp" >
  6.  
  7. <com.lixu.tongxunlu.PinnedSectionListView
  8. android:id="@+id/pslv"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content" />
  11.  
  12. </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. c++ primer 的 textquery 例子。

    总共3种方法,一种是第四版书上的面向对象的教学方法.一种是实际中应该使用的简洁方法.一种是模板的方法. 1)第四版书中,面向对象的方法,基类,继承,多态 2)自己的更简洁的写法.(前提条件:如果不需要 ...

  2. mysql Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

    错误原因:/var/lib/mysql目录中socket文件不存在.连接mysql服务器有两种方式:tcp连接,通过socket文件连接.通过socket文件,启动mysql服务,mysql服务会自动 ...

  3. Oracle的参数文件

    参数文件的作用: 它们是在数据库实例启动时候加载的,决定了数据库的物理结构.内存.数据库的限制及系统大量的默认值.数据库的各种物理属性.指定数据库控制文件名和路径等信息,是进行数据库设计和性能调优的重 ...

  4. 关于json 的那些知识点

    深入理解JSON对象 前面的话 json(javascript object notation)全称是javascript对象表示法,它是一种数据交换的文本格式,而不是一种编程语言,用于读取结构化数据 ...

  5. Lua了解 & 为什么游戏开发用Lua

    参考这篇文章 https://www.zhihu.com/question/21717567 看来就是网易风云为了让人写外挂不方便而采用的冷门语言.当然冷门的语言不代表不好用啦. Lua 虚拟机小,嵌 ...

  6. Android 热补丁动态修复框架小结

    一.概述 最新github上开源了很多热补丁动态修复框架,大致有: https://github.com/dodola/HotFix https://github.com/jasonross/Nuwa ...

  7. PLSQL Developer连接远程Oracle方法(非安装客户端)

    Oracle比较麻烦,通常需要安装oracle的客户端才能实现.通过instantclient可以比较简单的连接远程的Oracle. 1.新建目录D:\Oracle_Cleint用于存放相关文件,新建 ...

  8. VS2013和VS2008项目的互通

    VS2013和VS2008项目的互通,大家可能都查到了百度经验里面的一个帖子: http://jingyan.baidu.com/article/f54ae2fc3c3adc1e92b849de.ht ...

  9. iOS开发 Date转字符串

    + (NSString *)formatterDate:(NSNumber *)desDate WithDateFormatter:(NSString *)formatter{ NSDateForma ...

  10. Fragment的2中载入方式!

    1.静态有动态 代码如下: public class MainActivity extends AppCompatActivity { private ContentFragment cf; @Ove ...