全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

前言:

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

一:先看效果图

字母索引

搜索匹配

二:功能分析

1:汉字转拼音

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

拼音类

public class CNPinyin <T extends CN> implements Serializable, Comparable<CNPinyin<T>> {

  /**
   * 对应首字首拼音字母
   */
  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<T> 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;
  }
 

最后附上源码https://github.com/youxiaochen/ContactList

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


# android  # 通讯录搜索  # 通讯录索引  # 字母索引  # 使用adb命令向Android模拟器中导入通讯录联系人的方法  # Android获取手机通讯录、sim卡联系人及调用拨号界面方法  # Android通讯录开发之删除功能的实现方法  # Android个人手机通讯录开发详解  # Android实现通讯录效果——获取手机号码和姓名  # Android读取手机通讯录联系人到自己项目  # Android破解微信获取聊天记录和通讯录信息(静态方式)  # Android自定义View实现通讯录字母索引(仿微信通讯录)  # Android实现仿通讯录侧边栏滑动SiderBar效果代码  # Android Studio实现简单的通讯录  # 首个  # 第一个  # 详细介绍  # 递归  # 小陈  # 首字母  # 全拼  # 才是  # 如有  # 也很  # 下一  # 将不  # 先看  # 大家多多  # 搜索功能  # 总长度  # pinyinsTotalLength  # final  # getFirstChar  # data 


相关文章: 如何通过西部数码建站助手快速创建专业网站?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  如何用IIS7快速搭建并优化网站站点?  如何挑选最适合建站的高性能VPS主机?  如何快速生成橙子建站落地页链接?  教学网站制作软件,学习*后期制作的网站有哪些?  网页设计网站制作软件,microsoft office哪个可以创建网页?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何在企业微信快速生成手机电脑官网?  如何配置支付宝与微信支付功能?  seo网站制作优化,网站SEO优化步骤有哪些?  移民网站制作流程,怎么看加拿大移民官网?  建站之星导航如何优化提升用户体验?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  网站制作报价单模板图片,小松挖机官方网站报价?  在线制作视频的网站有哪些,电脑如何制作视频短片?  制作网站的公司有哪些,做一个公司网站要多少钱?  济南专业网站制作公司,济南信息工程学校怎么样?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  建站主机是什么?如何选择适合的建站主机?  建站主机选购指南:核心配置与性价比推荐解析  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  建站之星官网登录失败?如何快速解决?  建站之星备案是否影响网站上线时间?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  如何设计高效校园网站?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  建站之星微信建站一键生成小程序+多端营销系统  深圳网站制作培训,深圳哪些招聘网站比较好?  实例解析Array和String方法  如何快速生成专业多端适配建站电话?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  PHP正则匹配日期和时间(时间戳转换)的实例代码  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何快速建站并高效导出源代码?  如何用搬瓦工VPS快速搭建个人网站?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  网站制作需要会哪些技术,建立一个网站要花费多少?  如何通过虚拟主机快速完成网站搭建?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  开源网站制作软件,开源网站什么意思? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。