Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义AutoCompleteTextView';s自动补全规则_Android_Autocomplete_Autocompletetextview - Fatal编程技术网

Android 自定义AutoCompleteTextView';s自动补全规则

Android 自定义AutoCompleteTextView';s自动补全规则,android,autocomplete,autocompletetextview,Android,Autocomplete,Autocompletetextview,在许多地方,我看到了不同的自动完成方法,我认为这些方法非常基本,而其他方法实现得非常好 我的想法是拥有一个AutoCompleteTextView,但是定制它的自动完成方式。例如,我所有的自动补全建议都是单字字符串,其中空格由破折号(-)替换。如果我有一个建议,比如昨晚我坏了,我的目标是如果用户输入任何单词的第一个字母(我的意思是:l,n,I,w或b),建议就会显示出来。总结:将破折号视为空格,并显示与任何“单词”的任何子字符串匹配的建议。我认为这种自动完成非常有用!p> 我也有兴趣从建议中去掉

在许多地方,我看到了不同的自动完成方法,我认为这些方法非常基本,而其他方法实现得非常好

我的想法是拥有一个
AutoCompleteTextView
,但是定制它的自动完成方式。例如,我所有的自动补全建议都是单字字符串,其中空格由破折号(-)替换。如果我有一个建议,比如昨晚我坏了,我的目标是如果用户输入任何单词的第一个字母(我的意思是:
l
n
I
w
b
),建议就会显示出来。总结:将破折号视为空格,并显示与任何“单词”的任何子字符串匹配的建议。我认为这种自动完成非常有用!p> 我也有兴趣从建议中去掉一些角色。例如,假设我的所有自动建议都以
@
开头,并且用户输入
a
字母,那么将显示以
@a
开头的所有建议

是否存在类似的情况,或者至少可以自定义
AutoCompleteTextView
处理建议的方式?我查看了文档,但没有看到类似的内容(或者至少没有那么直接)


感谢您的帮助

我终于明白了。我做了一个
ArrayAdapter
扩展,它有一个内部
Filter
扩展,覆盖
performFiltering(CharSequence)
publishResults(CharSequence,FilterResults)
我能够实现我需要的行为(基本上使用
contains()比较两个
String
s)
而不是默认的
startsWith()

代码应该是这样的,希望它能帮助别人

public class SubstringFilterArrayAdapter<T> extends ArrayAdapter<T> implements Filterable {
  // Needed data structures
  ...
  final List<T> objects;
  final CustomFilter myfilter = new CustomFilter();
  ...

  public SubstringFilterArrayAdapter(final Context context_, final int tvResId_, final List<T> objects_) {
    objects = objects_;
    ...
  }

  @Override
  public Filter getFilter() {
    ...
  }

  private class CustomFilter extends Filter {
    @Override
    protected FilterResults performFiltering(final CharSequence prefix) {
      final FilterResults results = new FilterResults();
      final ArrayList<T> matched = new ArrayList<T>();


      // Put in matched the results that match the prefix using your own implementation
      ...

      results.values = matched;
      results.count = matched.size();

      return results;
    }

    @Override
    protected void publishResults(final CharSequence constraint, final FilterResults results) {
      objects = (List<T>) results.values;

      if (results.count > 0)
        notifyDataSetChanged();
      else
        notifyDataSetInvalidated();
    }
  }

  @Override
  public int getCount() {
    return objects.size();
  }

  @Override
  public T getItem(int position) {
    return objects.get(position);
  }
}
公共类SubstringFilterArrayAdapter扩展ArrayAdapter实现可过滤{
//所需的数据结构
...
最后列出对象;
最终CustomFilter myfilter=新CustomFilter();
...
public substringfilterrayadapter(最终上下文上下文、最终int-tvrist、最终列表对象){
对象=对象;
...
}
@凌驾
公共过滤器getFilter(){
...
}
私有类CustomFilter扩展了筛选器{
@凌驾
受保护的筛选器结果执行筛选(最终字符序列前缀){
最终FilterResults结果=新的FilterResults();
最终匹配的ArrayList=新ArrayList();
//使用您自己的实现输入匹配前缀的结果
...
结果:值=匹配;
results.count=匹配的.size();
返回结果;
}
@凌驾
受保护的void publishResults(最终CharSequence约束、最终FilterResults结果){
对象=(列表)results.values;
如果(results.count>0)
notifyDataSetChanged();
其他的
notifyDataSetionValidated();
}
}
@凌驾
public int getCount(){
返回objects.size();
}
@凌驾
公共T getItem(内部位置){
返回对象。获取(位置);
}
}