为Android联系人优化AutoCompleteTextView

时间:2011-02-10 19:50:00

标签: android autocomplete contacts

我已经实现了一项自动填充功能,允许用户开始输入联系人,并使用autoCompleteTextView将该联系人显示在下拉列表中,就像选择邮件或电子邮件的联系人一样。

因为我不希望变量同时保存所有联系人,因为这可能非常大,所以当用户在联系人字段中输入字母时,我填充了我的ArrayList。

我这样设置: - peopleList = new ArrayList>();

        adapter = new SimpleAdapter(this, peopleList, R.layout.customcontcell ,new String[] { "Name", "Phone" , "Type" }, new int[] { R.id.ccontName, R.id.ccontNo, R.id.ccontType });
        txtPhoneNo.setAdapter(adapter);

然后,当用户开始键入一个名称时,它会从匹配的所有行中获取所有行,这在我的函数“QueryContacts”中完成,如下所示: -

selectionWhere = ContactsContract.Contacts.DISPLAY_NAME+" LIKE '" + name + "%'";


                //Cursor to retrive contact details.
                Cursor people = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, selectionWhere, null, null);

然后使用此光标填充适配器正在使用的peopleList。

在这种状态下它可以正常工作,但是如果没有一些检查,上面的代码最终会检索所有的联系人(因为没有输入任何名称,因此它不会过滤任何内容),并且每次输入新的字母时它都会运行。这是紧张而缓慢的。

因此,我想进行一些简单的检查,将其限制为仅在输入2个字母时检索联系人,并且不再检索,除非它低于2个字母,然后再回到2个。

所以在我的QueryContacts函数中添加: -

if(name.length() < 2)
                mGotContacts = false;
            //If the length is two letters long and we haven't queried already, query for the name.
            if(name.length() == 2 && mGotContacts == false)
            {

// Cursor code
// Populate list with cursor data.
}

问题是现在autocompleteTextView不再下降,我已经检查过,填充了我的SimpleAdapter的变量peopleLists正在被正确更新。

那么,我这样做是一种愚蠢的方式吗?我应该一次性获取所有数据并让AutoCompleteTextView过滤它吗?

他们是一个更好的方法吗?为什么它不再适用于我的QueryContacts函数中的那些检查?

1 个答案:

答案 0 :(得分:1)

查看AutoCompleteTextView的阈值属性。阈值定义在显示自动完成下拉列表之前必须输入的字符数。我不确定这会对性能产生什么影响,但由于它原生于android,我想象它的合理可能性。 setThreshold method documentation