Android:IM应用通讯录的一种写法

本贴最后更新于 3138 天前,其中的信息可能已经时移世改

IM应用和许多具有IM功能的应用都少不了Contacts这个功能,就像Wechat里通讯录一样,这里不能上传图片啊。。。。。。。。。。。。。

实现这一功能需要以下几步:


  • 自定义一个View
  • 创建通讯录中User对象
  • 初始化View时对User对象进行排序

自定义字母表:

这个View中有两个变量,一个是26个字母,一个是被用户选中的index


    private String[] letters={"A","B","C","D", "E", "F", "G", "H", "I",
            "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
            "W", "X", "Y", "Z", "#"};
private int choose=-1;</pre>



这个View的onMeasure方法由于没有什么需要特别布置的,所以采用默认的就可以啦,然后是onDraw函数:

for(int i=0;i<letters.length;i++){
            paint.setColor(Color.WHITE);
            paint.setTypeface(Typeface.DEFAULT_BOLD);
            paint.setAntiAlias(true);
            paint.setTextSize(PixelUtils.sp2px(12));
            if(i==choose){
                paint.setColor(Color.BLACK);
                paint.setFakeBoldText(true);
                paint.setTextSize(PixelUtils.sp2px(15));
                float xSpec=0;
                float ySpec=singleHeight*i;
                canvas.drawText(letters[i], xSpec, ySpec, paint);
                paint.reset();
                continue;
            }
            float xPos=width/2-paint.measureText(letters[i])/2;
            float yPos=singleHeight*i+singleHeight;
            canvas.drawText(letters[i],xPos,yPos,paint);
            paint.reset();
        }
这个函数也很简单,就是计算得到单个字母所需要的宽度和高度,然后在居中位置写下Text,但是对用户choose的字母要特别处理,下面是onTouch函数:


switch(ev.getAction()){
            case MotionEvent.ACTION_MOVE:
                int height=getHeight();
                int yPos=(int)ev.getY();
                int indexY=yPos*letters.length/height;
                choose=indexY;
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                choose=-1;
                invalidate();
                break;
    }
    return true;</pre>

这里就是对 choose 赋值啦,至于为什么返回 true。。呵呵,我也不知道,按道理说这个最底层的 view,返回什么都应该没有关系了吧?有高人看到了可否解答一下,先谢谢了!



创建User对象:

这一步很简单,举个例子:

public class SortUser {
private AVUser user;
private String sortLetters;

public AVUser getUser(){ return user; }
public void setUser(AVUser user){ this.user=user;}
public String getSortLetters(){ return sortLetters;}
public void setSortLetters(String letters){ this.sortLetters=letters;}

}


这里就是原本的 User 加上新的 sortLetter 属性,构成了一个新的对象。sortLetter 当然就是用来给 Users 排序的啦!



排序过程:

        for(AVUser user:friends){
            SortUser sortUser=new SortUser();
            sortUser.setUser(user);
            String username=user.getString("nickname");
            if(username!=null){
                String pinyin = characterParser.getSelling(username);
                String sortString = pinyin.substring(0, 1).toUpperCase();
                if (sortString.matches("[A-Z]")) {
                    sortUser.setSortLetters(sortString.toUpperCase());
                } else {
                    sortUser.setSortLetters("#");
                }
            }else{
                sortUser.setSortLetters("#");
            }
            sortUsers.add(sortUser);
        }
        Collections.sort(sortUsers, pinyinComparator);
        return sortUsers;
这里可以看到,第一步就是将汉字转化为拼音,然后利用Collections的sort方法进行排序,这里说一下Colletions.sort的用法吧,有两种用法,这里只说用到的这种:



public static <T> void sort(List<T> list, Comparator<? super T> comparator)
Comparator是需要我们去继承的,例如,在我的例子中,就是这个:
public static class PinyinComparator implements Comparator<SortUser> {
        public int compare(SortUser o1, SortUser o2) {
            if (o1.getSortLetters().equals("@")
                    || o2.getSortLetters().equals("#")) {
                return -1;
            } else if (o1.getSortLetters().equals("#")
                    || o2.getSortLetters().equals("@")) {
                return 1;
            } else {
                return o1.getSortLetters().compareTo(o2.getSortLetters());
            }
        }
}</pre>
可以看到这里重写了一个compare的方法,返回-1,1分别代表排在前面和后面。








  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 65 关注
  • Contacts
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 128 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    96 引用 • 330 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 40 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 635 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 5 关注
  • 分享

    有什么新发现就分享给大家吧!

    242 引用 • 1750 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 131 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 345 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 219 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 350 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 45 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 230 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    205 引用 • 357 回帖 • 1 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 9 关注
  • sts
    2 引用 • 2 回帖 • 152 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 286 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 5 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 22 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 177 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    21 引用 • 74 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    51 引用 • 190 回帖 • 1 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 154 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 36 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 173 关注