之前做通訊錄軟件,其中在做撥號盤的時候一直為怎么實現t9輸入煩惱,上網找了很多帖子,都沒有滿意的答案。
不過最后終于是實現了,看社區內好像也有不少朋友需要,在此分享一下。
這個是在我項目中提取出來的撥號盤案例,功能上完全實現了目前其他通訊錄中撥號盤的功能,但在加載效率上還有不足,請各位大俠指教。
有圖有真相:
目前我用1g單核cpu的索愛mt15i的測試機,1500多的聯系人,加載時間大概在8秒左右,當然,一般用戶不會有這么多聯系人的。
由于我做的程序不是在一開始的界面就是撥號盤,所以我在程序已開始就在后臺異步加載聯系人,
等到撥號盤的界面,聯系人加載也差不多完成了。
不過我覺得每次在程序開始都讀取聯系人的數據,把他們整理成t9搜索需要的數據有些慢,
最好還是自己建張表來存放,然后監聽聯系人表的變化動態更新t9數據。
如果大家有更好更快的想法,希望能分享一下!
部分代碼:
public class topinyin {
/**
* 將傳遞的漢字list轉換成拼音list
* @param list
*/
public static list<string> getpinyinlist(list<string> list){
list<string> pinyinlist = new arraylist<string>();
for(iterator<string> i=list.iterator(); i.hasnext();) {
string str = (string)i.next();
try {
string pinyin = getpinyin(str);
pinyinlist.add(pinyin);
} catch (badhanyupinyinoutputformatcombination e) {
e.printstacktrace();
}
}
return pinyinlist;
}
/**
* 將中文轉換成拼音
* @param 拼音-漢字
* @return
*/
public static string getpinyin(string zhongwen)
throws badhanyupinyinoutputformatcombination {
string zhongwenpinyin = "";
char[] chars = zhongwen.tochararray();
for (int i = 0; i < chars.length; i++) {
string[] pinyin = pinyinhelper.tohanyupinyinstringarray(chars[i], getdefaultoutputformat());
// 當轉換不是中文字符時,返回null
if (pinyin != null) {
zhongwenpinyin += pinyin[0];
} else {
zhongwenpinyin += chars[i];
}
}
return zhongwenpinyin;
}
/**
* 輸出格式
*
* @return
*/
private static hanyupinyinoutputformat getdefaultoutputformat() {
hanyupinyinoutputformat format = new hanyupinyinoutputformat();
format.setcasetype(hanyupinyincasetype.uppercase);// 大寫
format.settonetype(hanyupinyintonetype.without_tone);// 沒有音調數字
format.setvchartype(hanyupinyinvchartype.with_u_and_colon);// u顯示
return format;
}