自定义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 = 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进行填充就可以了。


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值