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

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) 已经实现了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;

最后,在 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 方法