大家好,我是奶綠茶
研究了好一陣子的 Android
也上架了一個 WP7Contact 的 App,
來分享一下如果使用漢語拼音來排序聯絡人
android 官方有分享一個 HanziToPinyin.java
使用這個類別,就可以得到漢語拼音
接著透過 String 的 compareToIgnoreCase
就可以依字母排序
1. 得到聯絡人
先過濾一下,只要出現有電話的聯絡人即可,同時只要得到 _id 和 display_name 的欄位就好
2. 得到漢語拼音, 這個 function 是從 android 裡另一個類別取出的
ListView 使用的 Adapter
SourceCodeDownload
研究了好一陣子的 Android
也上架了一個 WP7Contact 的 App,
來分享一下如果使用漢語拼音來排序聯絡人
android 官方有分享一個 HanziToPinyin.java
使用這個類別,就可以得到漢語拼音
接著透過 String 的 compareToIgnoreCase
就可以依字母排序
1. 得到聯絡人
先過濾一下,只要出現有電話的聯絡人即可,同時只要得到 _id 和 display_name 的欄位就好
String select = "((" + ContactsContract.Data.DISPLAY_NAME + " NOTNULL) AND (" + ContactsContract.Data.HAS_PHONE_NUMBER + "=1) AND (" + ContactsContract.Data.DISPLAY_NAME + " != '' ))"; final String[] PROJECTION = new String[]{ ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME }; Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI, PROJECTION, select, null, null);
2. 得到漢語拼音, 這個 function 是從 android 裡另一個類別取出的
public static String getSortKey(String pName) { ArrayList排序的方法tokens = HanziToPinyin.getInstance().get(pName); if (tokens != null && tokens.size() > 0) { StringBuilder sb = new StringBuilder(); for (Token token : tokens) { if (Token.PINYIN == token.type) { if (sb.length() > 0) { sb.append(' '); } sb.append(token.target); sb.append(' '); sb.append(token.source); } else { if (sb.length() > 0) { sb.append(' '); } sb.append(token.source); } } return sb.toString(); } return pName; }
private final class PinyinComparator implements Comparator{ public int compare(ContactInfo o1, ContactInfo o2) { return o1.sort_key.compareToIgnoreCase(o2.sort_key); } }
ListView 使用的 Adapter
public class ContactAdapter extends BaseAdapter { private LayoutInflater mInflater; private ArrayList轉載請註明出處itemList; public ContactAdapter(Context context, ArrayList itemList) { mInflater = LayoutInflater.from(context); this.itemList = itemList; } public int getCount() { return itemList.size(); } public Object getItem(int position) { return itemList.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; ViewHolder holder = null; // 快取 ListView 的技巧 // 先斷判是否已經產生過 View // 把該子View 記錄下來,這樣就不用每次都重新 findViewById if (v == null) { v = mInflater.inflate(R.layout.main_list_row, null); holder = new ViewHolder(); holder.nameText = (TextView) v.findViewById(R.id.name_txt); holder.idText = (TextView) v.findViewById(R.id.description_txt); v.setTag(holder); } else { holder = (ViewHolder) v.getTag(); } holder.nameText.setText(itemList.get(position).contact_name); holder.idText.setText(itemList.get(position).sort_key); return v; } } private class ViewHolder { TextView nameText; TextView idText; } private class ContactInfo { String contact_name; String sort_key; long _id; }
SourceCodeDownload
留言