【问题标题】:Android TextView autocomplete and autosearchAndroid TextView 自动完成和自动搜索
【发布时间】:2012-01-03 05:57:57
【问题描述】:

我有一些适用于我的 Android 应用的联系人自动完成和自动搜索算法。 首先是一些 xml 来定义输入的文本视图:

<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;
    }

这适用于联系人号码和姓名输入。但是还有一个问题。用户可以输入多个电话号码。但是当一个联系人被应用到文本视图时,它不能再次搜索,因为算法需要整个字符串。

我该如何解决?

【问题讨论】:

    标签: android android-contacts


    【解决方案1】:

    编辑:

    好吧,我想了一会儿,发现我的解决方案有问题 - 没有地方可以将完成列表中的联系人插入到 TextView 中。

    解决方案好像是MultiAutoCompleteTextView,这个东西就是为解决你的问题而设计的。

    很抱歉造成混乱!


    对我来说,您似乎需要一个自定义适配器。

    您可以扩展 ArrayAdapter&lt;String&gt; 并实现 getFilter() - 当然,您还需要一个自定义过滤器(扩展 Filter),您将从该方法返回的实例。

    Filter 的performFiltering 方法有一个参数——需要建议列表的字符串。您需要在最后一个逗号(或您使用的任何字符作为分隔符)之后加入该部分并返回该子字符串的建议列表。

    附言

    为了更好的用户体验,您还可以考虑使用 Spans 设置 AutoCompleteTextView 内容的样式:http://ballardhack.wordpress.com/2011/07/25/customizing-the-android-edittext-behavior-with-spans/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2018-06-30
      • 2015-08-18
      • 2021-12-03
      • 2014-06-15
      • 2015-07-20
      相关资源
      最近更新 更多