Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 基於PinnedSectionListView實現聯系人通訊錄並且點擊打電話,手機通訊錄聯系人恢復

基於PinnedSectionListView實現聯系人通訊錄並且點擊打電話,手機通訊錄聯系人恢復

編輯:關於android開發

基於PinnedSectionListView實現聯系人通訊錄並且點擊打電話,手機通訊錄聯系人恢復


PinnedSectionListView具體下載地址、使用方法和注意事項:http://www.cnblogs.com/zzw1994/p/4997601.html

怎麼根據聯系人姓名首字符順序讀取聯系人:http://www.cnblogs.com/zzw1994/p/4998524.html

 

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 > 6 7 <com.zzw.contacts.PinnedSectionListView 8 android:id="@+id/listView" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" /> 11 12 </RelativeLayout> activity_main.xml

權限:

 <!-- 寫權限 -->
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <!-- 讀權限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <!-- 打電話權限 -->
    <uses-permission android:name="android.permission.CALL_PHONE" />

 

主要實現代碼:

  1 package com.zzw.contacts;
  2 
  3 import java.util.ArrayList;
  4 
  5 import com.zzw.contacts.PinnedSectionListView.PinnedSectionListAdapter;
  6 
  7 import android.app.Activity;
  8 import android.content.ContentResolver;
  9 import android.content.Context;
 10 import android.content.Intent;
 11 import android.database.Cursor;
 12 import android.graphics.Color;
 13 import android.net.Uri;
 14 import android.os.Bundle;
 15 import android.provider.ContactsContract;
 16 import android.view.LayoutInflater;
 17 import android.view.View;
 18 import android.view.ViewGroup;
 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 
 26     @Override
 27     protected void onCreate(Bundle savedInstanceState) {
 28         super.onCreate(savedInstanceState);
 29         setContentView(R.layout.activity_main);
 30 
 31         ArrayList<Contact> contacts = new ArrayList<Contact>();
 32         readContacts(contacts);
 33 
 34         final ArrayList<Item> items = new ArrayList<Item>();
 35 
 36         // 從字母A開始到Z。26個字母,遍歷聯系人中的首字符是否相等。
 37         // 相等則歸入一組。
 38         int A = (int) 'A';
 39         for (int i = 0; i < 26; i++) {
 40             int letter = A + i;
 41             char c = (char) letter;
 42 
 43             Item group = new Item();
 44             group.type = Item.GROUP;
 45             group.text = c + "";
 46             items.add(group);
 47 
 48             for (int j = 0; j < contacts.size(); j++) {
 49                 Contact contact = contacts.get(j);
 50                 String s = contact.firstLetterOfName();
 51                 if (s.equals(group.text)) {
 52                     Item child = new Item();
 53                     child.type = Item.CHILD;
 54                     child.text = contact.name + "  " + contact.getPhoneNumbers();
 55                     child.contact = contact;
 56                     items.add(child);
 57                 }
 58             }
 59         }
 60 
 61         PinnedSectionListView listView = (PinnedSectionListView) findViewById(R.id.listView);
 62 
 63         ArrayAdapter<Item> adapter = new MyAdapter(this, -1, items);
 64         listView.setAdapter(adapter);
 65 
 66         listView.setOnItemClickListener(new OnItemClickListener() {
 67 
 68             @Override
 69             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 70                 Item item = items.get(position);
 71 
 72                 if (item.type == Item.CHILD) {
 73                     Contact contact = item.contact;
 74                     // 簡單演示期間,我們只選擇第一個電話(不管有幾個電話)。
 75                     String number = contact.phoneNumbers.get(0);
 76                     if (!number.equals("")) {
 77                         // 撥打電話
 78                         Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number));
 79                         startActivity(intent);
 80                     }
 81                 }
 82             }
 83         });
 84 
 85     }
 86 
 87     private class MyAdapter extends ArrayAdapter<Item>implements PinnedSectionListAdapter {
 88 
 89         private LayoutInflater inflater;
 90         private ArrayList<Item> items;
 91 
 92         public MyAdapter(Context context, int resource, ArrayList<Item> items) {
 93             super(context, resource, items);
 94             this.items = items;
 95             inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 96         }
 97 
 98         @Override
 99         public int getCount() {
100             return items.size();
101         }
102 
103         @Override
104         public int getItemViewType(int position) {
105 
106             return items.get(position).type;
107         }
108 
109         @Override
110         public int getViewTypeCount() {
111 
112             return 2;
113         }
114 
115         @Override
116         public Item getItem(int position) {
117             return items.get(position);
118         }
119 
120         @Override
121         public View getView(int position, View convertView, ViewGroup parent) {
122 
123             String text = getItem(position).text;
124 
125             switch (getItemViewType(position)) {
126             case Item.GROUP:
127 
128                 if (convertView == null) {
129                     convertView = inflater.inflate(android.R.layout.simple_list_item_1, null);
130                 }
131 
132                 TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
133 
134                 // 首字符,分組的依據
135                 text1.setText(text);
136                 text1.setBackgroundColor(Color.GRAY);
137 
138                 break;
139 
140             case Item.CHILD:
141                 if (convertView == null) {
142                     convertView = inflater.inflate(android.R.layout.simple_list_item_2, null);
143                 }
144 
145                 TextView text2 = (TextView) convertView.findViewById(android.R.id.text2);
146                 text2.setText(text);
147 
148                 break;
149             }
150             return convertView;
151         }
152 
153         // 假設此方法返回皆為false。那麼PinnedSectionListView將退化成為一個基礎的ListView.
154         // 只不過退化後的ListView只是一個擁有兩個View Type的ListView。
155         // 從某種角度上講,此方法對於PinnedSectionListView至關重要,因為返回值true或false,
156         // 將直接導致PinnedSectionListView是一個PinnedSectionListView,還是一個普通的ListView。
157         @Override
158         public boolean isItemViewTypePinned(int viewType) {
159             boolean type = false;
160             switch (viewType) {
161             case Item.GROUP:
162                 type = true;
163                 break;
164 
165             case Item.CHILD:
166                 type = false;
167                 break;
168 
169             default:
170                 type = false;
171                 break;
172             }
173             return type;
174         }
175 
176     }
177 
178     // 讀取設備聯系人的一般方法。大致流程就是這樣,模板化的操作代碼。
179     private void readContacts(ArrayList<Contact> contacts) {
180         Uri uri = Uri.parse("content://com.android.contacts/contacts");
181         ContentResolver resolver = this.getContentResolver();
182 
183         // 在這裡我們給query傳遞進去一個SORT_KEY_PRIMARY
184         // 告訴ContentResolver獲得的結果按照聯系人名字的首字母有序排序
185         Cursor cursor = resolver.query(uri, null, null, null,
186                 android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);
187 
188         while (cursor.moveToNext()) {
189             // 聯系人id
190             String id = cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID));
191             // Sort key,讀取的聯系人按照姓名從 A->Z 的排序分組
192             String sork_key_primary = cursor
193                     .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));
194             // 獲取聯系人姓名
195             String name = cursor
196                     .getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));
197 
198             Contact mContact = new Contact();
199             mContact.id = id;
200             mContact.sort_key_primay = sork_key_primary;
201             mContact.name = name;
202 
203             // 獲取聯系人的手機號碼
204             Cursor phone = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
205                     ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null, null);
206             // 取得電話號碼(可能存在多個號碼)
207             // 因為在同一個名字下,用戶可能存有一個以上號碼
208             // 遍歷
209             ArrayList<String> phoneNumbers = new ArrayList<String>();
210             while (phone.moveToNext()) {
211                 int phoneFieldColumnIndex = phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
212                 String phoneNumber = phone.getString(phoneFieldColumnIndex);
213                 phoneNumbers.add(phoneNumber);
214             }
215 
216             mContact.phoneNumbers = phoneNumbers;
217             contacts.add(mContact);
218         }
219     }
220 
221     // 用於承載數據塊的類。
222     // 字段分為類型(type)和值(text)。
223     private class Item {
224         public static final int GROUP = 0;
225         public static final int CHILD = 1;
226 
227         public int type;
228         public String text;
229 
230         public Contact contact = null;
231     }
232 
233     // 用於裝載從聯系人數據庫中讀取到的數據。
234     // 結構化數據,便於數據操作和訪問。
235     private class Contact {
236         public String id;
237         public String name;
238         public String sort_key_primay;
239         public ArrayList<String> phoneNumbers;
240 
241         // 獲得一個聯系人名字的首字母。
242         // 比如一個人的名字叫做“安卓”,那麼這個人的首字母是:A
243         public String firstLetterOfName() {
244             String s = sort_key_primay.charAt(0) + "";
245 
246             return s.toUpperCase();
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 }

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved