搞定个性化输入提示--自定义AutoCompleteTextView
在设计app的输入界面时,假如假如智能提示,给用户带来的不只是方便,有时候还会是惊喜。通过实践研究,发现要实现android的个性化智能提示,实在非难事。
?
在Android中提供了两种智能输入框控件分是:MultiAutoCompleteTextView 和 AutoCompleteTextView 。
?
?MultiAutoCompleteTextView?继承自AutoCompleteTextView的可编辑的文本视图,能够对用户键入的文本进行有效地扩充提示,而不需要用户输入整个内容。(用户输入一部分内容,剩下的部分系统就会给予提示)。用户必须提供一个?MultiAutoCompleteTextView.Tokenizer?用来区分不同的子串。使用方法如下:
?
?
可是一运行,木有反应,没有一点提示?
?
的确,我们的视图与数据是绑定了,可是AutoCompleteTextView 却不能根据我们的Adapter获取到合适的数据,因为adapter不符合要求!
?
我们反过来再研究一下ArrayAdapter,它除了是BaseAdapter的子类,它还实现了 Filterable 接口!
?
我们在AutoAdapter中,实现该接口,并返回一个自定义的 Filter
?
?
那个AutoMailFilter又是一个什么样子的类呢?
?
先细细想想?AutoCompleteTextView 是怎样工作的,对,它只是对我们所输入的一些字符,进行过滤、索引,并组成相应的视图反馈给我们的用户,以提高我们的输入效率!
?
那接下来就是构建核心过滤器的时候了,AutoCompleteTextView?只会接收过滤后的数据,所以我们的数据源会多出一份拷贝,一份是原始的,一份则是过滤后的:
?
?
在AutoMailFilter里面,由于继承了,我们必须实现两个重要的方法:
?
protected FilterResults performFiltering(CharSequence prefix)?
在这个方法里面定制过滤策略,根据输入的prefix对数据进行过滤,并组装成FilterResults?结果返回;
?
protected void publishResults(CharSequence constraint, FilterResults results)?
这个方法则是发布结果用的,把上面方法的结果按照一定的要求进行处理后,通知Adapter进行数据视图的刷新
?
总结:
?
按照 AutoCompleteTextView?的工作流程,它依赖两个组件,Adapter 和 Filter,一个是视图的处理,一个是数据过滤处理,对这两个组件进行深度定制,我们就可以随心所欲了。
?
?