Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人

公司最近的项目中遇到一个需求需要读取通讯录联系人,并需要支持对联系人的模糊查询及批量选取,网上找了好几个例子,模糊查询这块处理的都有点小瑕疵,最终自己在各位网友的辛勤贡献基础之上进行了优化,最终做出了联系人模糊查询. 支持以下功能:

1.按 号码 , 姓名 , 首字母简拼 , 全拼 模糊查询

2.支持[A-Z]快速导航

3.支持联系人按首字母分类

4.支持联系人批量选取. 
界面如下:
 
代码结构:
 
主要代码:
ContactsActivity: 
package com.xbc.utils.activity;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;import com.xbc.contacts.R;
import com.xbc.utils.activity.ContactsSortAdapter.ViewHolder;
import com.xbc.utils.activity.SideBar.OnTouchingLetterChangedListener;public class ContactsActivity extends Activity {ListView mListView;EditText etSearch;ImageView ivClearText;private SideBar sideBar;private TextView dialog;private List<SortModel> mAllContactsList;private ContactsSortAdapter adapter;/*** 汉字转换成拼音的类*/private CharacterParser characterParser;/*** 根据拼音来排列ListView里面的数据类*/private PinyinComparator pinyinComparator;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_contacts);init();}private void init() {initView();initListener();loadContacts();}private void initListener() {/**清除输入字符**/ivClearText.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {etSearch.setText("");}});etSearch.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}@Overridepublic void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}@Overridepublic void afterTextChanged(Editable e) {String content = etSearch.getText().toString();if ("".equals(content)) {ivClearText.setVisibility(View.INVISIBLE);} else {ivClearText.setVisibility(View.VISIBLE);}if (content.length() > 0) {ArrayList<SortModel> fileterList = (ArrayList<SortModel>) search(content);adapter.updateListView(fileterList);//mAdapter.updateData(mContacts);} else {adapter.updateListView(mAllContactsList);}mListView.setSelection(0);}});//设置右侧[A-Z]快速导航栏触摸监听sideBar.setOnTouchingLetterChangedListener(new OnTouchingLetterChangedListener() {@Overridepublic void onTouchingLetterChanged(String s) {//该字母首次出现的位置int position = adapter.getPositionForSection(s.charAt(0));if (position != -1) {mListView.setSelection(position);}}});mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int position, long arg3) {ViewHolder viewHolder = (ViewHolder) view.getTag();viewHolder.cbChecked.performClick();adapter.toggleChecked(position);}});}private void initView() {sideBar = (SideBar) findViewById(R.id.sidrbar);dialog = (TextView) findViewById(R.id.dialog);sideBar.setTextView(dialog);ivClearText = (ImageView) findViewById(R.id.ivClearText);etSearch = (EditText) findViewById(R.id.et_search);mListView = (ListView) findViewById(R.id.lv_contacts);/** 给ListView设置adapter **/characterParser = CharacterParser.getInstance();mAllContactsList = new ArrayList<SortModel>();pinyinComparator = new PinyinComparator();Collections.sort(mAllContactsList, pinyinComparator);// 根据a-z进行排序源数据adapter = new ContactsSortAdapter(this, mAllContactsList);mListView.setAdapter(adapter);}private void loadContacts() {new Thread(new Runnable() {@Overridepublic void run() {try {ContentResolver resolver = getApplicationContext().getContentResolver();Cursor phoneCursor = resolver.query(Phone.CONTENT_URI, new String[] { Phone.DISPLAY_NAME, Phone.NUMBER, "sort_key" }, null, null, "sort_key COLLATE LOCALIZED ASC");if (phoneCursor == null || phoneCursor.getCount() == 0) {Toast.makeText(getApplicationContext(), "未获得读取联系人权限 或 未获得联系人数据", Toast.LENGTH_SHORT).show();return;}int PHONES_NUMBER_INDEX = phoneCursor.getColumnIndex(Phone.NUMBER);int PHONES_DISPLAY_NAME_INDEX = phoneCursor.getColumnIndex(Phone.DISPLAY_NAME);int SORT_KEY_INDEX = phoneCursor.getColumnIndex("sort_key");if (phoneCursor.getCount() > 0) {mAllContactsList = new ArrayList<SortModel>();while (phoneCursor.moveToNext()) {String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);if (TextUtils.isEmpty(phoneNumber))continue;String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);String sortKey = phoneCursor.getString(SORT_KEY_INDEX);//System.out.println(sortKey);SortModel sortModel = new SortModel(contactName, phoneNumber, sortKey);//优先使用系统sortkey取,取不到再使用工具取String sortLetters = getSortLetterBySortKey(sortKey);if (sortLetters == null) {sortLetters = getSortLetter(contactName);}sortModel.sortLetters = sortLetters;sortModel.sortToken = parseSortKey(sortKey);mAllContactsList.add(sortModel);}}phoneCursor.close();runOnUiThread(new Runnable() {public void run() {Collections.sort(mAllContactsList, pinyinComparator);adapter.updateListView(mAllContactsList);}});} catch (Exception e) {Log.e("xbc", e.getLocalizedMessage());}}}).start();}/*** 名字转拼音,取首字母* @param name* @return*/private String getSortLetter(String name) {String letter = "#";if (name == null) {return letter;}//汉字转换成拼音String pinyin = characterParser.getSelling(name);String sortString = pinyin.substring(0, 1).toUpperCase(Locale.CHINESE);// 正则表达式,判断首字母是否是英文字母if (sortString.matches("[A-Z]")) {letter = sortString.toUpperCase(Locale.CHINESE);}return letter;}/*** 取sort_key的首字母* @param sortKey* @return*/private String getSortLetterBySortKey(String sortKey) {if (sortKey == null || "".equals(sortKey.trim())) {return null;}String letter = "#";//汉字转换成拼音String sortString = sortKey.trim().substring(0, 1).toUpperCase(Locale.CHINESE);// 正则表达式,判断首字母是否是英文字母if (sortString.matches("[A-Z]")) {letter = sortString.toUpperCase(Locale.CHINESE);}return letter;}/*** 模糊查询* @param str* @return*/private List<SortModel> search(String str) {List<SortModel> filterList = new ArrayList<SortModel>();//过滤后的listif (str.matches("^([0-9]|[/+])*$")) {//正则表达式 匹配号码for (SortModel contact : mAllContactsList) {if (contact.number != null && contact.name != null) {if (contact.number.contains(str) || contact.name.contains(str)) {if (!filterList.contains(contact)) {filterList.add(contact);}}}}} else {for (SortModel contact : mAllContactsList) {if (contact.number != null && contact.name != null) {//姓名全匹配,姓名首字母简拼匹配,姓名全字母匹配if (contact.name.toLowerCase(Locale.CHINESE).contains(str.toLowerCase(Locale.CHINESE))|| contact.sortKey.toLowerCase(Locale.CHINESE).replace(" ", "").contains(str.toLowerCase(Locale.CHINESE))|| contact.sortToken.simpleSpell.toLowerCase(Locale.CHINESE).contains(str.toLowerCase(Locale.CHINESE))|| contact.sortToken.wholeSpell.toLowerCase(Locale.CHINESE).contains(str.toLowerCase(Locale.CHINESE))) {if (!filterList.contains(contact)) {filterList.add(contact);}}}}}return filterList;}String chReg = "[\\u4E00-\\u9FA5]+";//中文字符串匹配//String chReg="[^\\u4E00-\\u9FA5]";//除中文外的字符匹配/*** 解析sort_key,封装简拼,全拼* @param sortKey* @return*/public SortToken parseSortKey(String sortKey) {SortToken token = new SortToken();if (sortKey != null && sortKey.length() > 0) {//其中包含的中文字符String[] enStrs = sortKey.replace(" ", "").split(chReg);for (int i = 0, length = enStrs.length; i < length; i++) {if (enStrs[i].length() > 0) {//拼接简拼token.simpleSpell += enStrs[i].charAt(0);token.wholeSpell += enStrs[i];}}}return token;}}
注意:  本文由 微信妈妈(买卖公众号ontaobao.cn) 编辑整理,转载地址 http://www.itnose.net/detail/6164761.html
下载代码:  具体github地址:  https://github.com/cuixbo/FuzzyQueryContacts

Android通讯录模糊查询搜索(号码,姓名,首字母简拼,全拼),批量选取联系人相关推荐

  1. Android通讯录模糊匹配搜索实现 号码 首字母 简拼 全拼

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  2. Android通讯录模糊匹配搜索实现(号码、首字母、简拼、全拼)

    Android通讯录模糊匹配搜索实现(号码.首字母.简拼.全拼) 2013年12月10日 工作记录 小巫在工作中碰到一个需求,要求实现通讯录联系人的搜索,获取联系人的方式有好几种,我都有点混乱了,下面 ...

  3. Android通讯录模糊匹配搜索实现(号码 首字母 简拼 全拼)

    Android通讯录模糊匹配搜索实现(号码.首字母.简拼.全拼) 2013年12月10日 工作记录 小巫在工作中碰到一个需求,要求实现通讯录联系人的搜索,获取联系人的方式有好几种,我都有点混乱了,下面 ...

  4. 实现下拉框的汉字、拼音、首字母大小写,全拼检索选项

    调用这个工具类,可以实现下拉框的汉字.拼音.首字母大小写,全拼检索选项 import java.util.Arrays;import net.sourceforge.pinyin4j.PinyinHe ...

  5. Android通讯录模糊匹配搜索实现(号码、首字母,移动应用开发课程设计心得

    Log.i("wwj", sb.toString()); } cursor.close(); return contacts; } 关于模糊匹配,我真的有点头大,我想到的是用正则表 ...

  6. Elasticsearch-高级搜索(拼音|首字母|简繁|二级搜索)

    需求: 中文搜索.英文搜索.中英混搜 全拼搜索.首字母搜索.中文+全拼.中文+首字母混搜 简繁搜索 二级搜索(对第一次搜索结果,再进行搜索) 一.ES相关插件 IK分词: GitHub - medcl ...

  7. 关键字的首字母拼音和全拼搜索

    /*** @author ChineseSpelling* 所有全拼集合 汉字转拼音 使用工具类*/ public class ChineseSpelling {private static int[ ...

  8. Python3操作EXCEL,取汉字首字母,拼接全拼

    开发需求: 将EXCEL中某列特殊字符之前的汉字取首字母,特殊字符之后的汉字取全拼,然后用下划线"_"相连,写入下一列 把*******.xls中的汉字人名转成用户名,写到后面的单 ...

  9. mysql 汉字字母拼音_mysql 汉字按拼音字母排序、获取拼音首字母、拼音全拼

    一.汉字utf-8 转gbk排序 ORDER BY CONVERT(city_name USING gbk) 二.获取词语拼音首字母 创建函数 CREATE FUNCTION `firstPinyin ...

最新文章

  1. Java IO 总结图
  2. 国际化困境(第一篇)
  3. 皮一皮:直男只想说一句,表白?是表特别白吗?
  4. 逻辑回归的向量化实现样例
  5. Sublime Text 2报“Decode error - output not utf-8”错误的解决办法
  6. JAVA面试题(27)
  7. LeetCode 209. 长度最小的子数组
  8. nginx 启动命令_Windows环境下将Nginx安装到服务中的方法
  9. OpenShift 4 - 通过 REST API 操作 OpenShift
  10. AutoPager的简单实现
  11. awd赛题的flag是什么意思_记一次AWD自动获取flag并提交
  12. 姿态估计之Yaw Pitch Roll
  13. STM32编程--GPIO配置
  14. 【案例】星环科技×某能源企业:数据中台实践
  15. (64)计数器设计(递减计数器)
  16. 用vmware安装redhat 9出现“光盘无法被挂载”错误的解决办法
  17. 30个有发展前景的创业项目
  18. Java基础语法知识你真的都会吗?
  19. win7正版版本分析
  20. csharp基础练习题:小数的位数【难度:1级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练

热门文章

  1. IOS 沙盒(sandbox)机制和文件操作
  2. STM32使用Jlink下载出现NO cortex-M SW device Found解决(超详细)
  3. 疯狂java讲义pdf百度云,成功入职阿里
  4. SPARROW-JS 从0开始写 0依赖,原生JS框架
  5. 用PyOpenGL叩开3D的心扉——OpenGL全解析(1)
  6. Android 各版本演变特性整理
  7. 【微信小程序采坑】wx.canvasToTempFilePath生成图片第一次为全透明(白色)的问题?
  8. 帝国cms模板仿系统之家
  9. arduinopn532模块_Arduino 开源 NFC近场通讯模块 PN532
  10. 如何定义一个高逼格的原生JS插件