联系人字母排序、模糊搜索、选择

  • 支持侧边栏索引
  • 支持中文,数字,字母模糊搜索
  • 支持全选、单选联系人
  • 支持检查联系人是否已添加

单选演示

这里写图片描述

多选演示

这里写图片描述

功能解析

大部分代码都是比较简单的,这里就不粘贴占用篇幅了,只对几个技术点做下解析,大家可以直接下载源码观摩。

第一个问题:汉字转拼音

依赖tinypinyin库

implementation 'com.github.promeg:tinypinyin:2.0.3'
  • 1

拿到第一个汉字传进去,就自动转换成拼音,再取拼音的第一个字符即可

Pinyin.toPinyin(name.charAt(0)).toUpperCase().charAt(0)
  • 1

第二个问题:联系人如何从A-Z排序

在第一个问题中我们拿到了每个联系人的首字母,通过Comparator的compareTo对循环中的联系人进行升序排列

/**
     * 把联系人按照a b c升序排列
     */
    private static ArrayList<ContactInfo> compare(ArrayList<ContactInfo> contactInfos) {
        Collections.sort(contactInfos, new Comparator<ContactInfo>() {
            @Override
            public int compare(ContactInfo o1, ContactInfo o2) {
                //升序排列
                if (o1.getLetter().equals("@")
                        || o2.getLetter().equals("#")) {
                    return -1;
                } else if (o1.getLetter().equals("#")
                        || o2.getLetter().equals("@")) {
                    return 1;
                }
                return o1.getLetter().compareTo(o2.getLetter());
            }
        });
        return contactInfos;
    }

第三个问题:联系人如何按字母分类显显示分类字母

在第二个问题中我们把联系人按字母升序进行了排列,这里我们只需要判断首字母是否相等即可,即如果第一个联系人和第二个联系首字母不同,则说明不是一类,这是在第二个联系人上显示出索引字母即可。

public void onBindViewHolder(ContactAdapter.MyViewHodle holder, final int position) {
        ContactInfo contactInfo = mContactList.get(position);
        holder.name.setText(contactInfo.getName());
        holder.phone.setText(contactInfo.getPhone());

        //判断是否显示索引字母
        String currentLetter = contactInfo.getLetter();
        String previousLetter = position >= 1 ? mContactList.get(position - 1).getLetter() : "";
        if (!TextUtils.equals(currentLetter, previousLetter)) {
            holder.letter.setVisibility(View.VISIBLE);
            holder.letter.setText(currentLetter);
        } else {
            holder.letter.setVisibility(View.GONE);
        }
        .....省略.....
    }

第四个问题:联系人如何搜索

先取到所有联系人,再循环查找,把搜索到的联系人放入到另一个集合中,再传给RecycleView通知刷新

/**
     * 搜索联系人
     *
     * @param searchKey 搜索key
     */
    private void searchContacts(String searchKey) {
        for (ContactInfo info : mContactList) {
            if (ContactsUtils.searchContact(searchKey, info)) {
                mSearchList.add(info);
            }
        }
    }

/**
     * 模糊搜索(按中文,数字,字母搜索)
     */
    public static boolean searchContact(String searchStr, ContactInfo info) {
        return info.getName().contains(searchStr) || info.getPhone().contains(searchStr)
                || searchLowerByAlphabet(searchStr, info) || searchUpperByAlphabet(searchStr, info)
                || Pinyin.toPinyin(info.getName(), "").toLowerCase().contains(searchStr)
                || Pinyin.toPinyin(info.getName(), "").toUpperCase().contains(searchStr);
    }

第四个问题:联系人如何选择

通过isChooseContact字段判断是否选择上联系人

第四个问题:联系人如何判断是否已添加

通过isAddContact字段判断是否已添加上联系人

Demo下载

APK下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值