前言:

仿微信通讯录搜索功能,通过汉字或拼音首字母找到匹配的联系人并显示匹配的位置

一:先看效果图

字母索引

搜索匹配

二:功能分析

1:汉字转拼音

通讯录汉字转拼音(首个字符当考虑姓氏多音字), 现在转换拼音常见的有pinyin4j和tinypinyin, pinyin4j的功能强大,包含声调多音字,tinypinyin执行快占用内存少, 如果只是简单匹配通讯录,建议使用tinypinyin,用法也很简单这里不详细介绍

拼音类

public class CNPinyin implements Serializable, Comparable> {

/**

* 对应首字首拼音字母

*/

char firstChar;

/**

* 所有字符中的拼音首字母

*/

String firstChars;

/**

* 对应的所有字母拼音

*/

String[] pinyins;

/**

* 拼音总长度

*/

int pinyinsTotalLength;

public final T data;

CNPinyin(T data) {

this.data = data;

}

public char getFirstChar() {

return firstChar;

}

@Override

public String toString() {

StringBuilder sb = new StringBuilder().append("--firstChar--").append(firstChar).append("--pinyins:");

for (String str : pinyins) {

sb.append(str);

}

return sb.toString();

}

int compareValue() {

if (firstChar == DEF_CHAR) {

return 'Z' + 1;

}

return firstChar;

}

@Override

public int compareTo(CNPinyin tcnPinyin) {

int compare = compareValue() - tcnPinyin.compareValue();

if (compare == 0) {

String chinese1 = data.chinese();

String chinese2 = tcnPinyin.data.chinese();

return chinese1.compareTo(chinese2);

}

return compare;

}

}

2:定义索引栏 a~z,#控件

ItemDecoration配合RecyclerView实现StickyHeader效果,此效果很常见不详细介绍

3:根据转换好的拼音快速匹配

搜索匹配才是核心, 以下匹配原则,有优先顺序如果有匹配成功不执行后面的匹配原则

a:匹配原字符 并找出所匹配的起始位置与结束位置,如有中文匹配将不执行后面的拼音匹配原则

static CNPinyinIndex matcherChinese(CNPinyin cnPinyin, String keyword) {

if (keyword.length() < cnPinyin.data.chinese().length()) {

Matcher matcher = Pattern.compile(keyword, Pattern.CASE_INSENSITIVE).matcher(cnPinyin.data.chinese());

if (matcher.find()) {

return new CNPinyinIndex(cnPinyin, matcher.start(), matcher.end());

}

}

return null;

}

b:匹配单个字符拼音的首个字母(例如"游小陈"可以匹配y, x, c, yx, xc, yxc)

static CNPinyinIndex matcherFirst(CNPinyin cnPinyin, String keyword) {

if (keyword.length() <= cnPinyin.pinyins.length) {

Matcher matcher = Pattern.compile(keyword, Pattern.CASE_INSENSITIVE).matcher(cnPinyin.firstChars);

if (matcher.find()) {

return new CNPinyinIndex(cnPinyin, matcher.start(), matcher.end());

}

}

return null;

}

c:所有字符拼音的匹配, 且第一个匹配位置的拼音必须一致(例如"游小陈 youxiaochen", 必须匹配yo, you, xi, xia, xiao, ch, che, chen开头等 例如 yo youx, youxi, youxiao, xiaoc, xiaoch, xiaochen等等)

/**

* 所有拼音匹配

* @param cnPinyin

* @param keyword

* @return

*/

static CNPinyinIndex matchersPinyins(CNPinyin cnPinyin, String keyword) {

if (keyword.length() > cnPinyin.pinyinsTotalLength) return null;

int start = -1;

int end = -1;

for (int i = 0; i < cnPinyin.pinyins.length; i++) {

String pat = cnPinyin.pinyins[i];

if (pat.length() >= keyword.length()) {//首个位置索引

Matcher matcher = Pattern.compile(keyword, Pattern.CASE_INSENSITIVE).matcher(pat);

if (matcher.find() && matcher.start() == 0) {

start = i;

end = i + 1;

break;

}

} else {

Matcher matcher = Pattern.compile(pat, Pattern.CASE_INSENSITIVE).matcher(keyword);

if (matcher.find() && matcher.start() == 0) {//全拼匹配第一个必须在0位置

start = i;

String left = matcher.replaceFirst("");

end = end(cnPinyin.pinyins, left, ++i);

break;

}

}

}

if (start >= 0 && end >= start) {

return new CNPinyinIndex(cnPinyin, start, end);

}

return null;

}

/**

* 根据匹配字符递归查找下一结束位置

* @param pinyinGroup

* @param pattern

* @param index

* @return -1 匹配失败

*/

private static int end(String[] pinyinGroup, String pattern, int index) {

if (index < pinyinGroup.length) {

String pinyin = pinyinGroup[index];

if (pinyin.length() >= pattern.length()) {//首个位置索引

Matcher matcher = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE).matcher(pinyin);

if (matcher.find() && matcher.start() == 0) {

return index + 1;

}

} else {

Matcher matcher = Pattern.compile(pinyin, Pattern.CASE_INSENSITIVE).matcher(pattern);

if (matcher.find() && matcher.start() == 0) {//全拼匹配第一个必须在0位置

String left = matcher.replaceFirst("");

return end(pinyinGroup, left, index + 1);

}

}

}

return -1;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android 字母搜索栏,android仿微信通讯录搜索示例(匹配拼音,字母,索引位置)相关推荐

  1. android 通讯录 首字母索引,android仿微信通讯录搜索(匹配拼音,字母,索引位置标记颜色)...

    前言: 仿微信通讯录搜索功能,通过汉字或拼音首字母找到匹配的联系人并显示匹配的位置 一:先看效果图 字母索引 搜索匹配 二:功能分析 1:汉字转拼音 通讯录汉字转拼音(首个字符当考虑姓氏多音字), 现 ...

  2. Android仿微信通讯录

    Android仿微信通讯录 分3部: 1.listview实现显示头像.名字(太简单,这里就不写了) 通讯录页面xml布局代码: <LinearLayout xmlns:android=&quo ...

  3. 【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52355199 本文 ...

  4. android微信点赞ui,Android中使用PopupWindow 仿微信点赞和评论弹出

    微信朋友圈的点赞和评论功能,有2个组成部分:左下角的"更多"按钮:点击该按钮后弹出的对话框: PopupWindow,弹出框使用PopupWindow实现,这是点赞和评论的载体,具 ...

  5. Android录制视频,仿微信小视频录制(一)

    Android录制视频,第一部分自定义控件 简述 公司有一个录制视频并上传的功能,录制视频具体使用类如下:硬件控制使用Camera,视频录制的格式音频等具体配置与录制使用MediaRecorder,预 ...

  6. RecyclerView+index索引实现仿微信通讯录

    感觉之前写的有点乱,所以有重新整理了一下这个博客: demo下载地址:http://download.csdn.net/detail/qq_34501274/9799175 最近跟朋友聊天,说道博客相 ...

  7. 【uniapp前端组件】仿微信通讯录列表组件

    仿微信通讯录列表组件 示例图 前言 仿微信通讯录列表组件,可实现通讯列表以及选择多个联系人功能. 组件介绍 本组件有三个自定义组件构成,都已经集成在bugking7-contact-list中,该组件 ...

  8. 仿微信通讯录的Demo----PinnedHeaderListView

    仿微信通讯录的Demo--PinnedHeaderListView 侧边栏首字母匹配 + header分组 本示例代码来自网上 这里只贴出效果图,附件Demo源码,仅供学习和以后参考时用 附件 Dem ...

  9. uni-app 写小程序 索引列表,仿微信通讯录

    心里认定了一个女孩 就要好好的珍惜对待她,人生不容辜负,你必须要更加努力 .加油 骚年 uni-app 写小程序 索引列表,仿微信通讯录 去uni-app官网 下载插件 indexlist <m ...

最新文章

  1. 使用Python、OpenCV翻转图像(水平、垂直、水平垂直翻转)
  2. Linux下使用service启动jar包.md
  3. 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值 解决方案...
  4. 百度测试linux面试题,百度测试开发岗位面试题目
  5. oracle中导出的sql文件转入mysql中的工作记录
  6. android开发那些事儿(二)--Drawable资源
  7. 20天学习Spark(0)之最简单版Spark入门
  8. 小程序上传图片报错MiniProgramError “createUploadTask:fail url not in domain list“ 解决方案
  9. 计算机应用基础的重点知识,《计算机应用基础知识》重点总结
  10. 2019年高二上期末成都市调研考试总结暨寒假规划
  11. 关于数学计算机手抄报简单的,二年级数学简单手抄报图片大全
  12. excel应用(1)
  13. 正在保存“index.vue”: 从 “‘Vetur‘, ‘ESLint‘“ (configure)中获取代码操作。
  14. 系列之2-神经网络中反向传播与梯度下降的基本概念
  15. 万万没想到,乌克兰国防军队某系统的账号和密码分别是admin 和 123456!
  16. 算法--冒泡,选择,二分
  17. Vue 中实现快捷键CTRL + S(保存),CTRL+ Y(恢复),CTRL+ Z(回撤)
  18. 承载电脑游戏的计算机哪一年,电脑游戏的革新,承载一代人的青春
  19. 电子台账:模板制作之八——时间与产品名称所在行有交错的流水账格式
  20. 计算机通信与网络【笔记自用】

热门文章

  1. mysql内外三种连接_mysql之内连接,外连接(左连接,右连接),union,union all的区别...
  2. 多种方法列出集合中的所有子集(Python和Java实现)
  3. elementUI table 表格表头居中 颜色、内容居左
  4. 愤怒的小鸟的html制作,如何做html5山寨版愤怒的小鸟
  5. 小程序资源服务器,开发小程序没有服务器资源
  6. arduino编程语言教程_Arduino|编程语言说明
  7. php给网页加水印_php实现图片添加水印功能
  8. mysql检索整数_MyBatis从MySql DB中检索整数为Enum
  9. java split 路径,JAVA通过文件路径分隔符分割文件路径
  10. mysql乐观锁与事务_Mysql中的读锁,写锁,乐观锁及事务隔离级别和并发问题