自动填充文本输入仅显示与第一个字母匹配的项目

时间:2018-01-28 20:58:30

标签: android xamarin xamarin.forms xamarin.android autocompletetextview

我正在使用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的行为,以便搜索数组项中字符串的任何部分,应该返回它。

2 个答案:

答案 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) 已经实施了ArrayAdapterIFilterable

您只需要复制并粘贴它,然后替换:

            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

中的performFilteringpublishResults方法

答案 1 :(得分:0)

您需要应用过滤器在其中搜索并找到您想要的内容:

var childTypeString = mylist[num].Gettype().Name;

if (childTypeString  == "child1")
//....

else if (childTypeString  == "child2")
//...

将此内容放入文字更改事件