自动完成文本输入仅显示与第一个字母匹配的项目
Autocomplete Text Input only shows items that matches to the first letter only
我正在使用 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;
问题是当我尝试在我的联系人中搜索时,我只得到与第一个字母匹配的建议值。例如,如果 [paul@email.com、tom@email.com、bill@xamarin.com] 是联系人列表,如果我使用 "xamarin" 进行搜索,自动完成不会 return 什么都可以,但是如果我用 "bill" 搜索,它会 return。
我如何更改自动完成的行为以便搜索数组项中字符串的任何部分,它应该是 returned。
您需要应用过滤器在其中搜索并找到您想要的内容:
_adapter.Filter.InvokeFilter("your_Search");
speedSearch.Adapter = _adapter;
将其放入您的文本更改事件中
您需要创建自定义适配器并实施 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"时无法得到"bill@xamarin.com"的原因。您需要将其更改为 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;
注:
您还需要查看 Filter
class
中的 performFiltering and publishResults 方法
我正在使用 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;
问题是当我尝试在我的联系人中搜索时,我只得到与第一个字母匹配的建议值。例如,如果 [paul@email.com、tom@email.com、bill@xamarin.com] 是联系人列表,如果我使用 "xamarin" 进行搜索,自动完成不会 return 什么都可以,但是如果我用 "bill" 搜索,它会 return。 我如何更改自动完成的行为以便搜索数组项中字符串的任何部分,它应该是 returned。
您需要应用过滤器在其中搜索并找到您想要的内容:
_adapter.Filter.InvokeFilter("your_Search");
speedSearch.Adapter = _adapter;
将其放入您的文本更改事件中
您需要创建自定义适配器并实施 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"时无法得到"bill@xamarin.com"的原因。您需要将其更改为 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;
注:
您还需要查看 Filter
class