Android学习------运用 Filter 实现关键字搜索,并且高亮显示关键字

github:https://github.com/zhangiqlin/TestSearchView


新鲜出炉的demo   代码有点乱 讲究着看吧。。。头晕。。


先看 想要实现的功能效果 :


Android学习------运用 Filter 实现关键字搜索,并且高亮显示关键字_第1张图片



第一步  数据初始化  


第二步监听 输入框里面的 关键字   进行过滤   运用Filter 过滤


第三步 在自己的adapter类里面实现自己的  Filterable 接口   重写 getFilter()方法  返回自己的Filter对象


第四步  建立自己的Filter对象  并且在 performFiltering 方法里面实现你的过滤规则   完成以后返回filterResults 对象   publishResults 方法会接受到 performFiltering 方法返回的对象  然后更新listView 即可。

第五步 看代码

这里我使用了SearchView   用EdittextView 也可以。


先看MainActivity


public class MainActivity extends Activity {
	SearchView searchview;
	List list = new ArrayList();
	private SearchView.SearchAutoComplete edit;
	ListView listv;
	MyAdapter adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initData();
		initView();
	}

	private void initView() {
		// TODO Auto-generated method stub
		
		searchview = (SearchView) findViewById(R.id.searchview);
		
		listv = (ListView) findViewById(R.id.listv);
		
		adapter = new MyAdapter(this, list);

		listv.setAdapter(adapter);		

		listv.setTextFilterEnabled(true);

		searchview.setQueryHint("请输入你要查询的关键字");
		searchview.setIconified(false);
		searchview.setIconifiedByDefault(false);

		searchview.setOnQueryTextListener(new OnQueryTextListener() {

			@Override
			public boolean onQueryTextSubmit(String arg0) {
				// TODO Auto-generated method stub
				return false;
			}

			@Override
			public boolean onQueryTextChange(String queryText) {
				if (TextUtils.isEmpty(queryText)) {
					adapter.getFilter().filter(null);
				} else {
					adapter.getFilter().filter(queryText);
				}
				return true;
			}
		});

	}

	private void initData() {
		// TODO Auto-generated method stub
		list.add("张三");
		list.add("李思");
		list.add("王麻子");
		list.add("张三");
		list.add("aaaa");
		list.add("cccc");
		list.add("dd");
		list.add("qwe三");
		list.add("2444");
		list.add("vvvv");
		list.add("55522");
		list.add("667732f");
	}


上面的代码没啥好说的感觉 ,只是别忘记设置 listv.setTextFilterEnabled(true);   


public class MyAdapter extends BaseAdapter implements Filterable {

	private Context context;
	private ArrayList mOriginalValues;
	private List mObjects;

	private final Object mLock = new Object();

	private LayoutInflater mInflater;

	private String keyWrold = ""; // 关键字

	public MyAdapter(Context context, List list) {
		this.context = context;
		this.mObjects = list;
		this.mInflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		if (mObjects == null || mObjects.size() == 0)
			return 0;
		return mObjects.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		ViewHolder viewHolder;
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.item, parent, false);
			viewHolder = new ViewHolder();
			viewHolder.txtv = (TextView) convertView.findViewById(R.id.txtv);
			convertView.setTag(viewHolder);
		} else {
			viewHolder = (ViewHolder) convertView.getTag();
		}
		String str = mObjects.get(position).toString().toLowerCase();

		if (!keyWrold.equals("")) {
			String patten = "" + keyWrold;
			Pattern p = Pattern.compile(patten);
			Matcher m = p.matcher(str);
			SpannableString spannableString = new SpannableString(str);
			while (m.find()) {
				if (str.contains(m.group())) {
					spannableString.setSpan(
							new ForegroundColorSpan(0xffec8b44), m.start(),
							m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
				}
			}
			viewHolder.txtv.setText(spannableString);
		} else {
			SpannableString spannableString = new SpannableString(str);
			spannableString.setSpan(new ForegroundColorSpan(Color.BLACK), 0,
					str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
			viewHolder.txtv.setText(mObjects.get(position).toString());
		}
		return convertView;
	}

	class ViewHolder {
		TextView txtv;
	}

	@Override
	public Filter getFilter() {
		// TODO Auto-generated method stub
		return filter;
	}

	Filter filter = new Filter() {
		@Override
		protected void publishResults(CharSequence constraint,
				FilterResults results) {
			mObjects = (List) results.values;
			if (results.count > 0) {
				notifyDataSetChanged();
			} else {
				notifyDataSetInvalidated();
			}
		}

		@Override
		protected FilterResults performFiltering(CharSequence prefix) {
			// TODO Auto-generated method stub
			FilterResults filterResults = new FilterResults();

			if (mOriginalValues == null) {
				synchronized (mLock) {
					mOriginalValues = new ArrayList(mObjects);
				}
			}

			if (prefix == null || prefix.length() == 0) {
				ArrayList list;
				synchronized (mLock) {
					list = new ArrayList(mOriginalValues);
				}
				filterResults.values = list;
				filterResults.count = list.size();
				keyWrold = "";
			} else {
				String prefixString = prefix.toString().toLowerCase();
				ArrayList values;
				synchronized (mLock) {
					values = new ArrayList(mOriginalValues);
				}

				final int count = values.size();
				final ArrayList newValues = new ArrayList();

				for (int i = 0; i < count; i++) {
					final T value = values.get(i);
					final String valueText = value.toString().toLowerCase();
					// First match against the whole, non-splitted value
					if (valueText.contains(prefixString)) {
						newValues.add(value);
						keyWrold = prefixString;
					}
				}

				filterResults.values = newValues;
				filterResults.count = newValues.size();
			}

			return filterResults;
		}

	};

}

创建一个自己的filter对象  实现自己的过滤规则  最后在publishResults方法里面更新listview  , 如果需要给关键字加深颜色  注意看 getView  keyWrold  的处理  


凑合着看吧,有问题还望指出。  



你可能感兴趣的:(android)