【问题标题】:AutoCompleteTextView in androidandroid中的AutoCompleteTextView
【发布时间】:2012-03-10 17:04:33
【问题描述】:

在 Android AutoCompleteTextView 中,仅在我们正确输入第一个字母时才显示下拉菜单。我想要的是,当我在可用的字符串中输入任何字母序列时,它应该显示下拉菜单。例如,“January”在我的数组中,所以当我在自动完成字段中输入“anu”,它应该在下拉列表中显示“一月”。请帮忙。 谢谢你

【问题讨论】:

标签: android eclipse autocompletetextview


【解决方案1】:

您可能会编写自己的Filter 并通过TextWatcher 附加它。此响应在AutoCompleteTextView 中有一个正则表达式示例:Android AutoCompleteTextView with Regular Expression?,这是另一个正则表达式/java 示例:How can I perform a partial match with java.util.regex.*?

编辑:您需要扩展 ArrayAdapter 以覆盖 getFilter() 并返回您的自定义过滤器。

所以你会有这样的东西:

autoCompleteTextView.setAdapter(arrayAdapter);
autoCompleteTextView.addTextChangedListener(new TextWatcher() {
   public void onTextChanged(CharSequence s, int start, int before, int count) {
      arrayAdapter.getFilter().filter(s);
   }
});

public class RegexFilter extends Filter{

   ArrayAdapter<String> mAdapter;
   public RegexFilter(ArrayAdapter<String> adapter) {
      mAdapter = adapter;
   }
...
   @Override
   protected FilterResults performFiltering(CharSequence constraint) {
      Pattern p = Pattern.compile(constraint);
      Matcher m = p.matcher("");
      List listOfMatches = new ArrayList<String>();
      for (String curMonth : months) {
         m.reset(curMonth);
         if (m.matches || m.hitEnd()) {
            listOfMatches.add(curMonth);
         }
      }
      FilterResults results = new FilterResults();
      results.values = listOfMatches;
      results.count = listOfMatches.size();
      return results;
   }

   @Override
   protected void publishResults(CharSequence constraint, FilterResults results) {
      mAdapter.addAll(results.values);
      mAdapter.notifyDataSetChanged();
   }
}

public class PartialArrayAdapter extends ArrayAdapter<String> {
   ...
   RegexFilter mFilter;
   @Override
   public TimedSuggestionFilter getFilter() {
      if(null == mFilter)
         mFilter = new RegexFilter(this);
      return mFilter;
   }

【讨论】:

  • 抱歉,我在 AutoCompleteTextView 类中找不到 setFilter() 和 getFilter() 函数。我的 android API 级别为 8
  • @pyus13 编辑了我的代码。抱歉 getFilter() 函数在 ArrayAdapter 中。我建议做一个 ArrayAdapter 示例(可能像这样:sudarmuthu.com/blog/…)。适配器是 Android 的重要组成部分...
猜你喜欢
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 2016-03-20
相关资源
最近更新 更多