首页 > 代码库 > 自定义autoCompleteTextView实现自己的匹配规则。

自定义autoCompleteTextView实现自己的匹配规则。

用过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 = http://www.mamicode.com/mOriginalValues.get(i);>之后创建auto控件使用此adapter进行填充就可以了。


自定义autoCompleteTextView实现自己的匹配规则。