用过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进行填充就可以了。