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(内部位置){
返回对象。获取(位置);
}
}