大家好,我是奶綠茶
研究了好一陣子的 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
留言