2012-01-02 76 views
1

我有一些聯繫人自動完成和自動搜索算法爲我的Android應用程序工作。 首先是一些XML來定義爲輸入文本視圖:Android TextView自動完成和自動搜索

<AutoCompleteTextView 
     a:id="@+id/recipientBody" 
     a:layout_width="0dip" 
     a:layout_height="wrap_content" 
     a:layout_weight="1.0" 
     a:nextFocusRight="@+id/smsRecipientButton" 
     a:hint="@string/sms_to_whom" 
     a:maxLines="10" 
     /> 

現在我設置文本視圖

AutoCompleteTextView recip = 
     (AutoCompleteTextView) findViewById(R.id.recipientBody); 

ArrayAdapter<String> adapter = 
new ArrayAdapter<String>(this, R.layout.list_item, getAllContacts()); 
     recip.setAdapter(adapter); 

而現在實際的算法搜索與輸入相匹配的聯繫人:

private List<String> getAllContacts() { 
     List<String> contacts = new ArrayList<String>(); 
     ContentResolver cr = getContentResolver(); 
     Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

     if (cursor.getCount() > 0) { 
      while (cursor.moveToNext()) { 
       String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
       String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

       if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
        Cursor pCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
              null, 
              ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 
              new String[]{contactId}, null); 

        while (pCursor.moveToNext()) { 
         String phoneNumber = pCursor.getString(pCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));      
         contacts.add(phoneNumber + " (" + displayName + ")"); 
        } 

        pCursor.close(); 
       } 
      } 
     }  
     return contacts; 
    } 

這適用於聯繫號碼和姓名輸入。但仍然存在問題。用戶可以輸入多個電話號碼。但是當一個聯繫人應用於文本視圖時,它不能再搜索,因爲算法採用整個字符串。

我該如何解決這個問題?

回答

1

編輯:

嗯,我想過了一會兒,發現了一個問題,我的解決方案 - 有沒有地方,你可以插入從完成列表中的聯繫人到TextView的。

該解決方案似乎是MultiAutoCompleteTextView,這個東西是專爲解決你的問題。

不好意思!


對我來說,它看起來像你需要一個自定義適配器。

您可以擴展ArrayAdapter<String>並執行getFilter() - 當然您還需要一個自定義過濾器(擴展Filter),您將從該方法返回哪個實例。

過濾器的performFiltering方法有一個參數 - 需要建議列表的字符串。您需要將最後一個逗號後的部分(或您使用的任何字符作爲分隔符)並返回該子字符串的建議列表。

P.S.

爲了更好的用戶體驗,您還可以考慮使用Spans對您的AutoCompleteTextView內容進行造型:http://ballardhack.wordpress.com/2011/07/25/customizing-the-android-edittext-behavior-with-spans/