我正在使用 xamain 的自动完成文本输入控件。 Autocomplete reference
这是我的代码
var autoCompleteOptions = GetAllContacts();
ArrayAdapter autoCompleteAdapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleDropDownItem1Line, autoCompleteOptions);
speedSearch = FindViewById<AutoCompleteTextView>(Resource.Id.AutoCompleteInput);
speedSearch.Adapter = autoCompleteAdapter;
问题是当我尝试在联系人中搜索时,我只能得到仅与第一个字母匹配的建议值。例如,如果 [ [email protected] , [email protected] , [email protected] ] 是联系人列表,如果我使用“xamarin”进行搜索,自动完成功能不会返回任何内容,但如果我使用“bill”进行搜索,它将返回。 我如何更改自动完成的行为,以便搜索数组项中字符串的任何部分,并应将其返回。
最佳答案
您需要创建一个自定义适配器并实现 IFilterable .
Here is the source code of ArrayAdapter( java codes) ,您可以在ArrayFilter.performFiltering()
中找到这些代码:
if (valueText.startsWith(prefixString)) {
newValues.add(value);
} else {
final String[] words = valueText.split(" ");
for (String word : words) {
if (word.startsWith(prefixString)) {
newValues.add(value);
break;
}
}
}
注意startsWith
,这就是为什么当你输入“xa”时无法得到“[email protected]”。您需要将其更改为Contains
。
这是实现您目标的快速方法。
Here is a class--AutoAdapter
(C# codes) 它已经实现了ArrayAdapter
和IFilterable
。
您只需复制并粘贴它,然后替换:
var matches = from i in a.AllItems
where i.IndexOf(searchFor) >= 0
select i;
与:
var matches = from i in a.AllItems
where i.Contains(searchFor)
select i;
最后,在 MainActivity
中使用 AutoAdapter
:
AutoCompleteTextView textView = FindViewById<AutoCompleteTextView>(Resource.Id.autocomplete_country);
var adapter = new AutoAdapter(this, Resource.Layout.list_item, COUNTRIES);
textView.Threshold=1;
textView.Adapter = adapter;
注意:
您还需要查看performFiltering和 publishResults Filter
类中的方法
关于android - 自动完成文本输入仅显示与第一个字母匹配的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48491223/