之前做通訊錄軟體,其中在做撥號盤的時候一直為怎麼實現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; }
源碼下載