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

时间: 2024-10-06 23:36:01

自定义autoCompleteTextView实现自己的匹配规则。的相关文章

nginx之location匹配规则

1.概述 Nginx server块下的一个指令,每个server块可以包含多个location块. 2.作用 (1)基于Nginx服务器接收到的请求字符串(例如:server_name/usr-string),对除虚拟主机名称(也可以是ip别名)之外的字符串(例如:"/usr-string")进行匹配,对特定的匹配进行处理: (2)地址定向.数据缓存和应答控制等功能都是在这部分实现: (3)许多第三方模块的配置也是在location块中提供功能. 3.语法结构 Location [

SpringMVC HttpMessageConverter 匹配规则

以下内容,如有问题,烦请指出,谢谢! SpringMVC启动时会自动配置一些HttpMessageConverter,接收到http请求时,从这些Converters中选择一个符合条件的来进行Http序列化/反序列化.在不覆盖默认的HttpMessageConverters的情况下,我们添加的Converter可能会与默认的产生冲突,在某些场景中出现不符合预期的情况. 在上一篇文章的末尾已经列举了一个jsonConverter冲突的情况:添加一个最低优先级的FastJsonConverter后会

Spring Boot实战之定制URL匹配规则

本文首发于个人网站:Spring Boot实战之定制URL匹配规则 构建web应用程序时,并不是所有的URL请求都遵循默认的规则.有时,我们希望RESTful URL匹配的时候包含定界符".",这种情况在Spring中可以称之为"定界符定义的格式":有时,我们希望识别斜杠的存在.Spring提供了接口供开发人员按照需求定制. 在之前的几篇文章中,可以通过WebConfiguration类来定制程序中的过滤器.格式化工具等等,同样得,也可以在这个类中用类似的办法配置&

Go的http包中默认路由匹配规则

# 一.执行流程 首先我们构建一个简单http server: ```go package main import ( "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello world")) }) log.Fatal(http.Liste

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

在JaveWeb项目中配置Spring 匿名访问时,匹配规则的变相实现/*

实现/* /** * 根据当前的URL返回该url的角色集合. * 1.如果当前的URL在匿名访问的URL集合当中时,在当前的角色中添加匿名访问的角色(SysRole.ROLE_CONFIG_ANONYMOUS). * 2.如果当前系统不存在的情况,给当前用户添加一个公共访问的角色(SysRole.ROLE_CONFIG_PUBLIC). 3.url * 和角色映射,url和参数映射,给当前用户添加一个公共的角色(SysRole.ROLE_CONFIG_PUBLIC). * * @param o

Nginx之location 匹配规则详解

Nginx之location 匹配规则详解 关于一些对location认识的误区 1. location 的匹配顺序是"先匹配正则,再匹配普通". 矫正: location 的匹配顺序其实是"先匹配普通,再匹配正则".我这么说,大家一定会反驳我,因为按"先匹配普通,再匹配正则"解释不了大家平时习惯的按"先匹配正则,再匹配普通"的实践经验.这里我只能暂时解释下,造成这种误解的原因是:正则匹配会覆盖普通匹配(实际的规则,比这复杂,

Android中IntentFilter匹配规则详解——Android开发艺术探索笔记

欢迎转载,转载请注明出处http://blog.csdn.net/l664675249/article/details/50640288 启动Activity的方式分为两种,显示和隐式调用.显示调用很简单,直接指明要启动的Activity就可以了,这里主要介绍一下隐式调用.隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息.只有一个Intent同时匹配action,category和data才算匹配成功. 示例 <intent-filter> <acti

JavaScript中正则表达式判断匹配规则以及常用的方法

JavaScript中正则表达式判断匹配规则以及常用的方法: 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在. 正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它"匹配"了. \d可以匹配一个数字                 '00\d'可以匹配'007' ,'\d\d\d'可以匹配'010' \w可以匹配一个字母或数字      '\w\w'可以匹配'js' \s可