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