我正在使用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;
问题是当我尝试搜索我的联系人时,我只获得与第一个字母匹配的建议值。例如,如果[&#34; xamarin&#34;自动填充功能不会返回任何内容,但如果我使用&#34; bill&#34;它会回来。 如何更改autocompelte的行为,以便搜索数组项中字符串的任何部分,应该返回它。
答案 0 :(得分:2)
您需要创建自定义适配器并实施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;
最后,在AutoAdapter
:
MainActivity
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
类
答案 1 :(得分:0)
您需要应用过滤器在其中搜索并找到您想要的内容:
var childTypeString = mylist[num].Gettype().Name;
if (childTypeString == "child1")
//....
else if (childTypeString == "child2")
//...
将此内容放入文字更改事件