編輯:關於android開發
PinnedSectionListView具體下載地址、使用方法和注意事項:http://www.cnblogs.com/zzw1994/p/4997601.html
怎麼根據聯系人姓名首字符順序讀取聯系人:http://www.cnblogs.com/zzw1994/p/4998524.html



權限:
<!-- 寫權限 -->
<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 }
我們為什麼要在Android中使用RxJava
我們為什麼要在Android中使用RxJava 感覺RxJava最近風生水起,不學習一下都不好意思了,灑家也是初學RxJava,也是感覺代碼好像更復雜更難懂了,看了一
Android Xfermode 學習筆記,androidxfermode
Android Xfermode 學習筆記,androidxfermode一、概述 Xfermode全名transfer-mode,其作用是實現兩張圖疊加時的混合效果。
Android系統移植與調試之-------)如何修改Android系統默認顯示
Android系統移植與調試之-------)如何修改Android系統默認顯示 1、首先解決【設置】界面默認顯示【開發者選項】的問題 查看源代碼:pack
Android特效專輯(六)——仿QQ聊天撒花特效,無形裝逼,最為致命
Android特效專輯(六)——仿QQ聊天撒花特效,無形裝逼,最為致命 Android特效專輯(六)——仿QQ聊天撒花特效,無形裝逼,最為致命