AutoCompleteTextView输入汉字拼音首字母实现过滤提示(支持多音字)

AutoCompleteTextView具有输入提示的功能,但是它的这种提示不适合对股票列表的过滤,如果你玩过股票软件,就会知道只要输入股票名称的首字母或股票代码就会出现符合匹配的股票,这种过滤怎么实现呢?
还有个问题,汉字具有多音字,如何实现多音字的匹配,比如“长江证券”,无论你输入“cjzq”或者“zjzq”都会匹配到它,这都是需要解决的问题!
匹配的关键在于重写BaseAdapter,让它实现Filterable接口,重写其中的getFilter(),如果你参照ArrayAdaper源码的话,写起来就会容易很多,事实上我就是这么做的,^o^
下面看一下源码:

package com.ql.util;

import java.util.*;

import android.content.Context;
import android.util.Log;
import android.view.*;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;

public class SearchAdapter<T> extends BaseAdapter implements Filterable {
	private List<T> mObjects;

	private List<Set<String>> pinyinList;//支持多音字,类似:{
  {z,c},{j},{z},{q,x}}的集合

	private final Object mLock = new Object();

	private int mResource;

	private int mFieldId = 0;

	private Context mContext;

	private ArrayList<T> mOriginalValues;
	private ArrayFilter mFilter;

	private LayoutInflater mInflater;

	public static final int ALL=-1;//全部
	private int maxMatch=10;//最多显示多少个可能选项
	//支持多音字
	public SearchAdapter(Context context,int textViewResourceId, T[] objects,int maxMatch) {
		// TODO Auto-generated constructor stub
		init(context, textViewResourceId, 0, Arrays.asList(objects));
		this.pinyinList = getHanziSpellList(objects);
		this.maxMatch=maxMatch;
	}
	
	public SearchAdapter(Context context,int textViewResourceId, List<T> objects,int maxMatch) {
		// TODO Auto-generated constructor stub
		init(context, textViewResourceId, 0, objects);
		this.pinyinList = getHanziSpellList(objects);
		this.maxMatch=maxMatch;
	}
	
	private void init(Context context, int resource, int textViewResourceId,List<T> objects) {
		mContext = context;
		mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		mResource = resource;
		mObjects = objects;
		mFieldId = textViewResourceId;
	}

	
	/**
	 * 获得汉字拼音首字母列表
	 */
	private List<Set<String>> getHanziSpellList(T[] hanzi){
		List<Set<String>> listSet=new ArrayList<Set<String>>();
		PinYin4j pinyin=new PinYin4j();
		for(int i=0;i<hanzi.length;i++){
			listSet.add(pinyin.getPinyin(hanzi[i].toString()));
		}
		return listSet;
	}
	/**
	 * 获得汉字拼音首字母列表
	 */
	private List<Set<String>> getHanziSpellList(List<T> hanzi){
        List<Set<String>> listSet=new ArrayList<Set<String>>();
        PinYin4j pinyin=new PinYin4j();
        for(int i=0;i<hanzi.size();i++){
        	listSet.add(pinyin.getPinyin(hanzi.get(i).toString()));
        }
        return listSet;
	}
	
	public int getCount() {
		return mObjects.size();
	}

	public T getItem(int position) {
		return mObjects.get(position);
	}

	public int getPo
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值