通讯录模糊匹配

之前自己写的通讯录模糊匹配,因为需求改过,代码有过修改,所以逻辑可能比较乱,不过已经实现了模糊匹配。包括汉字,拼音,大小写匹配等。需要的同学可以参考下
实现思路:在EditText中添加监听 et_search.addTextChangedListener(new EditChangeListener(ConnectsActivity.this, connectsList, connectsQueryList, adapter));
EditChangeListener是自定义的,继承自TextWatcher,用于监听EditText数据变化。
connectsList是通讯录数据集合,connectsQueryList是查询后的符合条件的数据集合,adapter是用于显示通讯录数据的适配器。

我在代码中添加了注释
具体代码如下:(这里只粘出了TextWatcher的onTextChanged中的代码,主要逻辑都在这个方法中)

@Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        //获取搜索框输入的内容
        SpannableStringBuilder builder = (SpannableStringBuilder) s;
        //这里是将输入的字母全部转换为大写字母
        StringBuffer sb = new StringBuffer();
        Pattern p = Pattern.compile("[a-zA-Z]");
        Matcher m;
        if (input != null && input.length() != 0) {
            m = p.matcher(input.substring(0, 1));
            if (m.matches()) {
                if (input != null) {
                    for (int i = 0; i < input.length(); i++) {
                        char c = input.charAt(i);
                        if (Character.isUpperCase(c)) {
                            sb.append(c);
                        } else if (Character.isLowerCase(c)) {
                            sb.append(Character.toUpperCase(c));
                        }
                    }
                }
                input = sb.toString();
            }
        } 
        //因为是时时匹配,所以需要将查询后的数据集合清空
        connectsQueryList.clear();
        //BaseConnects是定义的数据对象,存放姓名,姓名转化后的拼音(默认已经全部转化为大写拼音),电话等信息
        for (BaseConnects haoHan : connectsList) {
            int startIndex = 0;
            if (haoHan.getPhone1()!=null){
                //这里判断拼音、姓名、电话是否包含输入的信息
                if (haoHan.pinyin.contains(input) || haoHan.getAccountName().contains(input)||haoHan.getPhone1().contains(input)) {
                    //这里去除重复数据
                    if (!connectsQueryList.contains(haoHan)) {
                        connectsQueryList.add(haoHan);
                    }
                }
            }else {
                if (haoHan.pinyin.contains(input) || haoHan.getAccountName().contains(input)||haoHan.phone.contains(input)) {
                    if (!connectsQueryList.contains(haoHan)) {
                        connectsQueryList.add(haoHan);
                    }
                }
            }
            //下面是模糊匹配核心代码
            //首先将输入的字符串查分成字符
            for (int i = 0; i < input.toCharArray().length; i++) {
                char c = input.toCharArray()[i];
                String str = haoHan.pinyin.substring(startIndex, haoHan.pinyin.length());
                //判断拼音中是否包含该字符
                if (str.contains(String.valueOf(c))) {
                    for (int i1 = 0; i1 < str.toCharArray().length; i1++) {
                        char c1 = str.toCharArray()[i1];
                        if (i1 != str.toCharArray().length) {
                            if (c1 != c) {
                                startIndex++;
                            } else {
                                //如果字符匹配则跳出该轮循环,进入下一轮循环
                                if (i == input.toCharArray().length - 1) {
                                    if (!connectsQueryList.contains(haoHan)) {
                                        connectsQueryList.add(haoHan);
                                    }
                                }
                                break;
                            }
                        }

                    }
                } else {
                    adapter.notifyDataSetChanged();
                    break;
                }
            }
        }
        //刷新数据
        adapter.notifyDataSetChanged();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值