AutoCompleteTextView 这个东西做Android的应该都看过~没看过的去百度下吧,我就不多说了,问题是它怎么能自动补全的呢?
这个是因为它setAdapter(adapter);,没错,你没看错,就是因为它设置了一个adapter。。。而它的过滤原则也是根据这个adapter中的Filter来的。
一般网上的那些例子里面都是设置的一个ArrayAdapter,这个adapter里面的Filter看源码就能看出来是怎么过滤的:
public Filter getFilter() { if (mFilter == null) { mFilter = new ArrayFilter(); } return mFilter; } /** * <p>An array filter constrains the content of the array adapter with * a prefix. Each item that does not start with the supplied prefix * is removed from the list.</p> */ private class ArrayFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence prefix) { FilterResults results = new FilterResults(); if (mOriginalValues == null) { synchronized (mLock) { mOriginalValues = new ArrayList<T>(mObjects); } } if (prefix == null || prefix.length() == 0) { ArrayList<T> list; synchronized (mLock) { list = new ArrayList<T>(mOriginalValues); } results.values = list; results.count = list.size(); } else { String prefixString = prefix.toString().toLowerCase(); ArrayList<T> values; synchronized (mLock) { values = new ArrayList<T>(mOriginalValues); } final int count = values.size(); final ArrayList<T> newValues = new ArrayList<T>(); for (int i = 0; i < count; i++) { final T value = values.get(i); final String valueText = value.toString().toLowerCase(); // First match against the whole, non-splitted value if (valueText.startsWith(prefixString)) {//看到没有~这就是匹配原则。。。就是这么蛋疼,就是这么酸爽 newValues.add(value); } else { final String[] words = valueText.split(" "); final int wordCount = words.length; // Start at index 0, in case valueText starts with space(s) for (int k = 0; k < wordCount; k++) { if (words[k].startsWith(prefixString)) { newValues.add(value); break; } } } } results.values = newValues; results.count = newValues.size(); } return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { //noinspection unchecked mObjects = (List<T>) results.values; if (results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } }
所以,我的做法就是,直接复制整个ArrayAdapter类,然后将里面的那句原则改掉,改成 valueText.contains(prefixString) ,这样在设置的时候设自定义的这个类,然后,然后就能看到全局匹配的AutoCompleteTextView了。
相关推荐
AutoCompleteTextView是自动匹配字符
比如在百度搜索内容时,当我们在搜索框内输入部分内容时,下面就会出现很多相关内容的提示供我们选择。要在手机的一个输入框中也实现这样的功能。该怎么做呢?可以研究此代码的实现方法
匹配项中实现图文混排效果。 很简单的一个例子
只是一个很简单的例子,用autocompletetextview自动匹配姓名,在通讯录中查找,找到后点击会在下面的一个textview中显示出电话号码,适合初学者
Android AutoCompleteTextView控件学习 博客地址:http://blog.csdn.net/csdnyuandaimaxuexi/article/details/48439951
android API中的 AutoCompleteTextView组件只能匹配过滤纯英文或者纯汉字的 经过改进后可以输入 汉字拼音匹配汉字 类似于百度搜索 例如输入x 会匹配“迅雷”“迅速” 如果输入s 也可以匹配 “迅速”
AutoCompleteTextView简单的匹配实例
AutoCompleteTextView 显示更多
本Demo展示了Android项目中AutoCompleteTextView以及MultiAutoCompleteTextView的简单使用,对其进行属性设置,以及数据填充。
Android自定义AutoCompleteTextView
AutoCompleteTextViewDemo,实现显示历史记录功能。
AutoCompleteTextView自动完成文字输入 连接:http://i.cnblogs.com/EditPosts.aspx?opt=1
用AutoCompleteTextView实现中文和拼音关联自动提示
Android2.3版 autocompleteTextview控件使用 源代码
AutoCompleteTextView汉字和拼音关联,可以输入汉字和拼音查询
autoCompleteTextView自定义BaseAdapter,实现下拉单的自定义样式,用sqlite数据库存放历史记录,进行写入时提示。点击某个下拉单写入autoCompleeTextView中。
扩展Android系统自带的AutoCompleteTextView控件,逐字提示,支持自定义类对象指定显示字段
AutoCompleteTextView大多是采用ArrayAdapter进行适配的,这种有时候并不能满足我们的需求,所以就有了这个demo