当前位置: 代码迷 >> Android >> 获取手机通讯录放入PinnedSectionListView中,按名字首字母排序,而且实现拨打电话功能
  详细解决方案

获取手机通讯录放入PinnedSectionListView中,按名字首字母排序,而且实现拨打电话功能

热度:48   发布时间:2016-04-27 22:04:56.0
获取手机通讯录放入PinnedSectionListView中,按名字首字母排序,并且实现拨打电话功能。
  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         @Override125         public int getCount() {126             return data.size();127         }128 129         @Override130         public Object getItem(int position) {131             return data.get(position);132         }133 134         @Override135         public int getItemViewType(int position) {136             return data.get(position).type;137         }138 139         @Override140         public int getViewTypeCount() {141             return Data.STYE;142         }143 144         @Override145         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         @Override177         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             // 联系人的id209             String id = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));210             // 将联系人按姓名首字母分组211             String sort_key_primary = cursor212                     .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));213             // 获取联系人的名字214             String name = cursor215                     .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>

效果示例图:

  相关解决方案