Android之开源类库Pinyin4j的使用----搜索联系人

Pinyin4j只能算是Java开源类库,但是在Android的应用开发中也经常被用到。大家都用过手机的通讯录,通讯录的搜索联系人的功能,用pinyin4j就可以实现。下面我给大家带来这个例子,使用pinyin4j实现搜索联系人功能。

首先先对pinyin4j做一个简单的介绍:

pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换,拼音的输出格式也可以定制,并且支持汉字的多音字。pinyin4j的官方网是:http://pinyin4j.sourceforge.net/

pinyin4j的使用手册,百度文库里有一个文档,大家要是想详细了解pinyin4j的使用,请点击pinyin4j的使用手册

再继续讲之前,还是先带大家看一下本案例的效果图:

接下来咱们看一下工程目录:

本案例总共就两个类,其中PinyinTool是一个工具类,其代码如下:

package com.gc.testcontactpeopledemo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
/**
 *
 * @author Android将军
 *
 */
public class PinyinTool {
	public static HanyuPinyinOutputFormat format;
	public static List<Map<String,Map<String,String>>> list;
	public static Map<String,Map<String,String>> map;
	public static Map<String,String> pMap;
	public static List<String> strList;
	/**
	 *  功能:根据联系人姓名生成拼音缩写与拼写全写
	 * @param strList 存储联系人姓名的List
	 * @throws BadHanyuPinyinOutputFormatCombination
	 */
	public static void setData(List<String> strList) throws BadHanyuPinyinOutputFormatCombination
	{
		PinyinTool.strList=strList;
		format=new HanyuPinyinOutputFormat();
		format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);
		list=new ArrayList<Map<String,Map<String,String>>>();
		for(int i=0;i<strList.size();i++)
		{
			 map=new HashMap<String, Map<String,String>>();
			 pMap=new HashMap<String, String>();
			 pMap.put("simple", getSimple(strList.get(i)));
			 pMap.put("complex", getComplex(strList.get(i)));
			 map.put(strList.get(i), pMap);
			 list.add(map);
		}

	}
	/**
	 * 功能:获取字符串str的拼音缩写
	 * @param str
	 * @return
	 */
	public static String getSimple(String str)
	{
		StringBuilder sb=new StringBuilder();
		String tempSimple=null;
		for(int i=0;i<str.length();i++)
		{
			tempSimple=getCharacterSimple(str.charAt(i));
			if(tempSimple==null)
			{
				sb.append(str.charAt(i));
			}else
			{
				sb.append(tempSimple);
			}
		}

		return sb.toString();
	}
	/**
	 * 功能:获取字符C的拼音首字母
	 * @param c
	 * @return
	 */
	public static String getCharacterSimple(char c)
	{
		String[] str=null;
		try {
			str=PinyinHelper.toHanyuPinyinStringArray(c, format);
		} catch (BadHanyuPinyinOutputFormatCombination e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if(str==null)
			return null;
		return str[0].charAt(0)+"";
	}
	public static String getComplex(String str)
	{
		StringBuilder sb=new StringBuilder();
		String tempSimple=null;
		for(int i=0;i<str.length();i++)
		{
			tempSimple=getCharacterComplex(str.charAt(i));
			if(tempSimple==null)
			{
				sb.append(str.charAt(i));
			}else
			{
				sb.append(tempSimple);
//				System.out.println(sb.toString());
			}
		}

		return sb.toString();
	}
	public static String getCharacterComplex(char c)
	{
		String[] str=null;
		try {
			str=PinyinHelper.toHanyuPinyinStringArray(c, format);
		} catch (BadHanyuPinyinOutputFormatCombination e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if(str==null)
			return null;
		return str[0];
	}
	/**
	 * 功能:搜索符合条件的联系人
	 * @param str 当前联系人List
	 * @return 新的联系人List
	 */
	public static List<String> search(String str)
	{
		List<String> temp=new ArrayList<String>();
		for(int i=0;i<list.size();i++)
		{
			if(list.get(i).get(strList.get(i)).get("complex").contains(str)||list.get(i).get(strList.get(i)).get("simple").contains(str))
			{
				System.out.println(strList.get(i));
				temp.add(strList.get(i));
			}
		}
		return temp;

	}

}

下面再给出MainActivity的代码,如下:

package com.gc.testcontactpeopledemo;

import java.util.ArrayList;
import java.util.List;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
/**
 *
 * 功能:搜索联系人功能
 * @author Android将军
 *
 */
public class MainActivity extends Activity implements TextWatcher {

	private EditText mEditText;
	private ListView mListView;
	private PinyinHelper mPinyinHelper;
	private MyAdapter mMyAdapter;
	private List<String> mList;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        setData();
        initUI();
        setListeners();

    }
    /**
     * 初始化联系人数据
     */
    public void setData()
    {
    	mList=new ArrayList<String>();
    	mList.add("安徽");
    	mList.add("王小二");
    	mList.add("Android将军");
    	mList.add("天津大麻花");
    	mList.add("马场道");
    	mList.add("海河湾");
    	mList.add("五大道");
    	mList.add("苏州道");
    	mList.add("爱国道");
    	mList.add("天津图书大厦");

    }
    /**
     * 初始化组件
     */
    public void initUI()
    {
    	mEditText=(EditText)findViewById(R.id.search);
    	mListView=(ListView)findViewById(R.id.listview);
    	mMyAdapter=new MyAdapter();
    	mListView.setAdapter(mMyAdapter);
    	try {
			PinyinTool.setData(mList);
		} catch (BadHanyuPinyinOutputFormatCombination e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    /**
     * 设置监听
     */
    public void setListeners()
    {
    	mEditText.addTextChangedListener(this);

    }
    /**
     * EditText监听事件,提供搜索功能
     */
	@Override
	public void beforeTextChanged(CharSequence s, int start, int count,
			int after) {
		for(int i=0;i<mList.size();i++)
		{

		}

	}
	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		// TODO Auto-generated method stub
		final String str=s.toString();
		new Thread(){

			@Override
			public void run() {
				mList=PinyinTool.search(str.toString());
				Message message=new Message();
				message.what=0;
				mHandler.sendMessage(message);
			}

		}.start();

	}
	@Override
	public void afterTextChanged(Editable s) {
		// TODO Auto-generated method stub

	}

	Handler mHandler=new Handler(){

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			if(msg.what==0)
			{
				mMyAdapter.notifyDataSetChanged();
			}
		}

	};
	/**
	 * 自定义Adapter,为ListView提供数据
	 * @author Chao Gong
	 *
	 */
	public class MyAdapter extends BaseAdapter{

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mList.size();
		}

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

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

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ItemHodlerView mItemHodlerView;
			if(convertView==null)
			{
				convertView=LayoutInflater.from(getApplicationContext()).inflate(R.layout.listview_item, null);
				mItemHodlerView=new ItemHodlerView();
				mItemHodlerView.mTextView=(TextView)convertView.findViewById(R.id.tv);
				convertView.setTag(mItemHodlerView);
			}
			else
			{
				mItemHodlerView=(ItemHodlerView)convertView.getTag();
			}
			mItemHodlerView.mTextView.setText(mList.get(position));
			mItemHodlerView.mTextView.setTag(position);
			return convertView;
		}

	}
	private class ItemHodlerView
	{
		private ImageView mImageView;
		private TextView mTextView;
	}
}

由于代码比较简单再加上有部分注释,故在此就不做过多的解释了,如果还有不明白处,回复留言即可。

转载请注明出处:http://blog.csdn.net/android_jiangjun/article/details/40422251

时间: 2024-10-10 21:32:59

Android之开源类库Pinyin4j的使用----搜索联系人的相关文章

Android常用开源项目

Android常用开源项目 Android   2014-05-23 16:39:43 发布 您的评价:       4.3   收藏     24收藏 Android开源项目第一篇--个性化控件(View)篇  包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.其他Android开源项目第二篇--工具库篇  包括依赖注入.图片缓存.网络相关.数据库ORM工具包.Android公

【Android】开源项目汇总-备用

from://http://www.eoeandroid.com/home.php?mod=space&uid=765778&do=blog&id=47674 Android开源项目第一篇--个性化控件(View)篇  包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.其他Android开源项目第二篇--工具库篇  包括依赖注入.图片缓存.网络相关.数据库ORM工具

IOS 一些开源类库

因 为iOS SDK相对比较底层,所以开发者就得受累多做一些体力活.不过幸运的是,有很多第三方的类库可以用来简化很多不必要的工作.笔者整理了一下在本人学习过程 中用到的一些比较有用Objective-C开源类库,既是做一个总结,同时也希望通过这些分享,能提高各位的开发效率. KissXml——xml解析库 相关教程: github:https://github.com/Threew/KissXML http://sencho.blog.163.com/blog/static/8305622820

Android Bitmap 开源图片框架分析(精华三)

主要介绍这三个框架,都挺有名的,其他的框架估计也差不多了 Android-Universal-Image-Loaderhttps://github.com/nostra13/Android-Universal-Image-Loader ImageLoaderhttps://github.com/novoda/ImageLoader Volley(综合框架,包含图片部分)https://github.com/mcxiaoke/android-volley 扯淡时间,可以跳过这段这些开源框架的源码还

转:常用的几个提高iOS开发效率的开源类库及工具

常用的几个提高iOS开发效率的开源类库及工具 iOS开发者 : 开发几个常用的开源类库及下载地址: 算上这个连接:http://wenku.baidu.com/view/bbeb0091dd88d0d233d46a00.html 1.json json编码解码2.GTMBase64 base64编码解码3.TouchXML xml解析4.SFHFKeychainUtils 安全保存用户密码到keychain中 5.MBProgressHUD 很棒的一个加载等待特效框架6.ASIHTTPReque

【转载】android 常用开源框架

对于Android初学者以及对于我们菜鸟,这些大神们开发的轻量级框架非常有用(更别说开源的了). 下面转载这10个框架的介绍:(按顺序来吧没有什么排名). 一.  Afinal 官方介绍: Afinal是一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp. 通过finalActivity,我们可以通过注解的方式进行绑定ui和事件. 通过finalBitmap,我们可以方便的加载bitmap图片,而无

ios开源类库工具Cocoapods使用注意事项-错误解决办法

在使用Cocoapods时,如果我们没有正确的使用的话,会产生一些问题或者错误 如何解决?本文来介绍一下: 1.为工程添加框架,在上一篇文章中说明了如何安装和简单的使用AFNetworking框架 但是现在我想添加一下其他的框架,比如MBProgressHUD,如何做? 首先,进入工程的根目录下,查找MBProgressHUD... 执行命令: pod search mbpro 会搜索到匹配的框架: -> MBProgressHUD (0.9.1) An iOS activity indicat

常用的几个提高iOS开发效率的开源类库及工具

转自 iOS开发者 : 几个常用的开源类库及下载地址: 算上这个连接:http://wenku.baidu.com/view/bbeb0091dd88d0d233d46a00.html 1.json json编码解码2.GTMBase64 base64编码解码3.TouchXML xml解析4.SFHFKeychainUtils 安全保存用户密码到keychain中 5.MBProgressHUD 很棒的一个加载等待特效框架6.ASIHTTPRequest http等相关协议封装7.EGORef

使用CocoaPods管理第三方开源类库

iOS开发中经常会用到许多第三方类库,比如AFNetworking.FMDB.JSONKit等等,使用CocoaPods这个工具就能很方便得对工程中用到的类库进行管理,包括自动下载配置以及更新. 首先需要下载安装CocoaPods,系统要求有ruby环境,至少OS X 10.9以后是自带ruby环境的(Python也自带了),使用"ruby -v"命令可以查看当前ruby版本. 配置过程如下: 1.ruby环境 不放心的话可以先确认下ruby环境,据说由于GFW的影响,大都把Ruby镜