用过autoCompleteTextView(后面简称auto)的同学都知道,它默认是从字符串的头部开始匹配的。
或者中间有空格的也能从空格开始匹配后面的字符串。乍一看还以为是auto的匹配规则问题,
其实是Adapter的问题(本来使用的是ArrayAdapter)。
要怎么样自定义匹配规则呢?!
1.自定义adapter继承自baseAdapter
2.实现Filterable接口,发现里面有一个必须实现的方法getFilter()。
3.了解到getFilter()方法必须返回一个Filter类型的对象。
4,.在自定义adapter中创建继承Filter的内部类。
5,.在内部类中实现对数据的匹配规则。
具体看代码。
public class myAdapter<T> extends BaseAdapter implements Filterable { private List<T> mOriginalValues; private List<T> mObject; private final Object mLock = new Object(); private int mResouce; private MyFilter myFilter = null; private LayoutInflater inflater; public myAdapter(Context context,int TextViewResouceId,List<T> objects) { init(context,TextViewResouceId,objects); } private void init(Context context, int textViewResouceId, List<T> objects) { inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mObject = objects; mResouce = textViewResouceId; myFilter = new MyFilter(); } @Override public int getCount() { return mObject.size(); } @Override public T getItem(int position) { return mObject.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { return getViewFromResouce(position,convertView,parent,mResouce); } private View getViewFromResouce(int position, View convertView, ViewGroup parent, int mResouce2) { if(convertView == null) { convertView = inflater.inflate(mResouce2, parent,false); } TextView tv = (TextView)convertView; T item = getItem(position); if(item instanceof CharSequence) { tv.setText((CharSequence)item); } else { tv.setText(item.toString()); } return tv; } //返回过滤器 @Override public Filter getFilter() { return myFilter; } //自定义过滤器 private class MyFilter extends Filter { //得到过滤结果 @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); if(mOriginalValues == null) { synchronized (mLock) { mOriginalValues = new ArrayList<T>(mObject); } } int count = mOriginalValues.size(); ArrayList<T> values = new ArrayList<T>(); for(int i = 0;i < count;i++) { T value = mOriginalValues.get(i); String valueText = value.toString(); //自定义匹配规则 if(valueText != null && constraint != null && valueText.contains(constraint)) { values.add(value); } } results.values = values; results.count = values.size(); return results; } //发布过滤结果 @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { //把搜索结果赋值给mObject这样每次输入字符串的时候就不必 //从所有的字符串中查找,从而提高了效率 mObject = (List<T>)results.values; if(results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } } }
之后创建auto控件使用此adapter进行填充就可以了。
时间: 2024-10-06 23:36:01