《Android開發卷——手機連絡人T9搜尋》

來源:互聯網
上載者:User

標籤:擷取手機連絡人   contract   t9搜尋   android   撥號演算法   

    

自己研究了好幾天連絡人的T9搜尋演算法, 先分享出來給大家看看. 歡迎指教.如果有大神有更好的T9搜尋演算法, 那更好啊,大家一起研究研究,謝謝.

第一部分是比較簡單的擷取手機連絡人.

擷取連絡人前提要有許可權.

<uses-permission android:name="android.permission.READ_CONTACTS" />

因為手機的連絡人都儲存在資料庫裡面,所以我們只要把資料庫裡的資訊查詢出來即可.

private static final String[] PHONES_PROJECTION = new String[] {
Phone.DISPLAY_NAME, Phone.NUMBER, Photo.SORT_KEY_ALTERNATIVE};

ContentResolver resolver = getBaseContext().getContentResolver();
Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,
PHONES_PROJECTION, null, null, null);

這裡我只是簡單的說一下而已,後面的遍曆phoneCursor 就能把連絡人查詢出來.(我項目裡是開一條線程擷取連絡人的,以防太多連絡人導致頁面空白或者卡頓)


第二部分是T9搜尋部分

思路是: a只要連絡人的號碼有包含我輸入的數字就add到list進去,

b連絡人的姓名拼音有包含我輸入的拼音就add到list進去,

c連絡人的姓名縮寫拼音有包含我輸入的拼音就add到list進去

舉個例子--連絡人姓名:測試,號碼:1234567890

情況一:我輸入1234567890就能把測試顯示出來

情況二:我輸入23744(ceshi),因為這個"測試"的拼音,所以也能把測試顯示出來

情況三:我輸入(27)cs,這是"測試"的拼音縮寫,所以也能把測試顯示出來

當然我輸入23(ce)或者744(shi)什麼的,都可以把測試顯示出來.

以上是我的思路,下面附上一段代碼

public class MainT9 extends Activity{private int[] textViewId = new int[]{R.id.main_num_1,R.id.main_num_2,R.id.main_num_3,R.id.main_num_4,R.id.main_num_5,R.id.main_num_6,R.id.main_num_7,R.id.main_num_8,R.id.main_num_9,R.id.main_num_left,R.id.main_num_0,R.id.main_num_right,R.id.main_num_delete};private TextView[] textView = new TextView[textViewId.length];private EditText inputEditText;private ListView mListView;private List<ContractBean> mList;private List<ContractBean> list;private MyAdapter myAdapter;private static final String[] PHONES_PROJECTION = new String[] {Phone.DISPLAY_NAME, Phone.NUMBER, Photo.SORT_KEY_ALTERNATIVE};long waitTime = 300;  long touchTime = 0;/** * 判斷是否人為輸入 */private boolean isWrite = false;private boolean isAfresh = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);this.setContentView(R.layout.main_activity);mList = new ArrayList<ContractBean>();list = new ArrayList<ContractBean>();/** * 剛開始啟動程式時,開條線程去擷取連絡人 */new Thread(getContract).start();for(int i = 0;i<textViewId.length;i++){textView[i] = (TextView) this.findViewById(textViewId[i]);textView[i].setOnClickListener(click);}inputEditText = (EditText) this.findViewById(R.id.main_num_edit);//hideSystemKeyBoard(inputEditText);mListView = (ListView) this.findViewById(R.id.main_contract_listview);myAdapter = new MyAdapter(this, mList);mListView.setAdapter(myAdapter);inputEditText.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {// TODO Auto-generated method stubif (isWrite) {isWrite = false;return;}isWrite = true;String inputStr = "";String newStr = s.toString();newStr = newStr.replace(" ", "");int index = 0;if (true) {if ((index + 3) < newStr.length()) {inputStr += (newStr.substring(index, index + 3) + " ");index += 3;}}while ((index + 4) < newStr.length()) {inputStr += (newStr.substring(index, index + 4) + " ");index += 4;}inputStr += (newStr.substring(index, newStr.length()));inputEditText.setText(inputStr);inputEditText.setSelection(inputStr.length());if(count == 0){isAfresh = true;}else{isAfresh = false; }long currentTime = System.currentTimeMillis();if ((currentTime - touchTime) >= waitTime) {touchTime = currentTime;searchConstract(isAfresh);}}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {// TODO Auto-generated method stub}@Overridepublic void afterTextChanged(Editable s) {// TODO Auto-generated method stub}});}private void searchConstract(boolean isAfresh){if(isAfresh){if(mList!=null){myAdapter.updateListView(mList);}else{new Thread(getContract).start();}}else{String  str1= inputEditText.getText().toString();str1 = str1.replace(" ", "");SearchContract search = new SearchContract(str1);search.start();}}/** * T9搜尋線程 * @author Chillax_KUN */class SearchContract extends Thread{String body;SearchContract(String body){this.body = body;}@Overridepublic void run() {// TODO Auto-generated method stubsuper.run();Iterator<ContractBean> iterator = mList.iterator();list = new ArrayList<ContractBean>();list.clear();while(iterator.hasNext()){ContractBean sortModel = iterator.next();String search = sortModel.getSearch();String phone = sortModel.getPhone();phone = phone.replace(" ", "");String zimu = sortModel.getZimu();if(phone.contains(body) || search.contains(body)||zimu.contains(body)){list.add(sortModel);}}h.sendEmptyMessage(1);}}/** * 開啟線程,擷取連絡人 */Runnable getContract = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubmList = getPhoneContacts();h.sendEmptyMessage(0);}};private List<ContractBean> getPhoneContacts() {ContentResolver resolver = getBaseContext().getContentResolver();Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION, null, null, null);List<ContractBean> mList = new ArrayList<ContractBean>();if (phoneCursor != null) {phoneCursor.moveToFirst();while (!phoneCursor.isAfterLast()) {ContractBean model = new ContractBean();String name = phoneCursor.getString(0);String phone = phoneCursor.getString(1);String search = phoneCursor.getString(2);model.setName(name);model.setPhone(phone);model.setSearch(getNum(search,false));String zimu = "";String str[] = search.split(" ");if(str.length>0){for(int i = 0;i<str.length;i++){if(str[i].length()==1){zimu = zimu + str[i];}}}model.setZimu(getNum(zimu,true));mList.add(model);phoneCursor.moveToNext();}if(phoneCursor!=null){phoneCursor.close();}return mList;}return mList;}/** * 將連絡人的姓名拼音全部轉化為數字 * @param 連絡人姓名拼音 * @return 姓名拼音對應數字 */public String getNum(String search, boolean status){String str = "";for(int i = 0;i<search.length();i++){String c = search.charAt(i)+"";if(c.equals("1")){str = str + "1";if(status){i = i + 1;}continue;}else if(c.equals("A")||c.equals("B")||c.equals("C")||c.equals("2")||c.equals("a")||c.equals("b")||c.equals("c")){str = str + "2";if(status){i = i + 1;}continue;}else if(c.equals("D")||c.equals("E")||c.equals("F")||c.equals("3")||c.equals("d")||c.equals("e")||c.equals("f")){str = str + "3";if(status){i = i + 1;}continue;}else if(c.equals("G")||c.equals("H")||c.equals("I")||c.equals("4")||c.equals("g")||c.equals("h")||c.equals("i")){str = str + "4";if(status){i = i + 1;}continue;}else if(c.equals("J")||c.equals("K")||c.equals("L")||c.equals("5")||c.equals("j")||c.equals("k")||c.equals("l")){str = str + "5";if(status){i = i + 1;}continue;}else if(c.equals("M")||c.equals("N")||c.equals("O")||c.equals("6")||c.equals("m")||c.equals("n")||c.equals("o")){str = str + "6";if(status){i = i + 1;}continue;}else if(c.equals("P")||c.equals("Q")||c.equals("R")||c.equals("S")||c.equals("7")||c.equals("p")||c.equals("q")||c.equals("r")||c.equals("s")){str = str + "7";if(status){i = i + 1;}continue;}else if(c.equals("T")||c.equals("U")||c.equals("V")||c.equals("8")||c.equals("t")||c.equals("u")||c.equals("v")){str = str + "8";if(status){i = i + 1;}continue;}else if(c.equals("W")||c.equals("X")||c.equals("Y")||c.equals("Z")||c.equals("9")||c.equals("w")||c.equals("x")||c.equals("y")||c.equals("z")){str = str + "9";if(status){i = i + 1;}continue;}else if(c.equals("0")){str = str + "0";if(status){i = i + 1;}continue;}}return str;};Handler h = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);if(msg.what==0){if(mList!=null && myAdapter!=null){myAdapter.updateListView(mList);myAdapter.notifyDataSetChanged();}} else if(msg.what==1){myAdapter.updateListView(list);}}};OnClickListener click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.main_num_1:inputEditText.setText(inputEditText.getText()+"1");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_2:inputEditText.setText(inputEditText.getText()+"2");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_3:inputEditText.setText(inputEditText.getText()+"3");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_4:inputEditText.setText(inputEditText.getText()+"4");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_5:inputEditText.setText(inputEditText.getText()+"5");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_6:inputEditText.setText(inputEditText.getText()+"6");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_7:inputEditText.setText(inputEditText.getText()+"7");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_8:inputEditText.setText(inputEditText.getText()+"8");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_9:inputEditText.setText(inputEditText.getText()+"9");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_0:inputEditText.setText(inputEditText.getText()+"0");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_left:inputEditText.setText(inputEditText.getText()+"*");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_right:inputEditText.setText(inputEditText.getText()+"#");inputEditText.setSelection(inputEditText.getText().toString().length());break;case R.id.main_num_delete:String string = inputEditText.getText().toString();if(!string.equals("")){inputEditText.setText(string.subSequence(0, string.length()-1));inputEditText.setSelection(inputEditText.getText().toString().length());}break;default:break;}}};/** * 通過反射調用setShowSoftInputOnFocus(false) 來隱藏鍵盤。 用 InputType.TYPE_NULL方法,無法顯示光線標。 */private void hideSystemKeyBoard(View view) {this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);try {Class<EditText> cls = EditText.class;Method setSoftInputShownOnFocus;// 此方法為隱藏的需用java反射調用setSoftInputShownOnFocus = cls.getMethod("setShowSoftInputOnFocus",boolean.class);setSoftInputShownOnFocus.setAccessible(true);setSoftInputShownOnFocus.invoke((EditText) view, false);} catch (Exception e) {e.printStackTrace();}}}


源碼地址:http://download.csdn.net/detail/chillax_li/7467553


尊重原創, 轉載請註明出處:http://blog.csdn.net/chillax_li/article/details/29380615


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.