我已经实现了一项自动填充功能,允许用户开始输入联系人,并使用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函数中的那些检查?
答案 0 :(得分:1)
查看AutoCompleteTextView的阈值属性。阈值定义在显示自动完成下拉列表之前必须输入的字符数。我不确定这会对性能产生什么影响,但由于它原生于android,我想象它的合理可能性。 setThreshold method documentation