連絡先のアルファベット順の並べ替え、あいまい検索、選択

  • サイドバーインデックスをサポート
  • 中国語、数字、文字のあいまい検索をサポート
  • すべての選択、単一選択の連絡先をサポート
  • 連絡先が追加されているかどうかを確認するためのサポート

単一選択デモ

ここに写真の説明を書いてください

多肢選択式デモ

ここに写真の説明を書いてください

機能分析

ほとんどのコードは比較的単純なので、ここに貼り付けてスペースをとることはありません。いくつかの技術的なポイントのみを分析します。ソースコードを直接ダウンロードして観察することができます。

最初の質問:拼音への中国語の文字

tinypinyinライブラリに依存

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

最初の漢字を取得して渡すと、自動的に拼音に変換されてから、拼音の最初の文字が取得されます。

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

2番目の質問:AZから連絡先を並べ替える方法

最初の質問では、各連絡先の最初の文字を取得し、コンパレータの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;
    }

3番目の質問:連絡先の分類文字をアルファベットで表示する方法

2番目の質問では、連絡先をアルファベットの昇順で並べました。ここでは、連絡先の最初の文字が等しいかどうか、つまり、最初の連絡先の最初の文字と2番目の連絡先が異なるかどうかを判断するだけで済みます。それらが同じタイプではないこと。、これは、2番目の連絡先にインデックス文字を表示するためのものです。

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);
        }
        .....省略.....
    }

4番目の質問:連絡先を検索する方法

最初にすべての連絡先を取得してから、もう一度検索し、検索した連絡先を別のコレクションに入れてから、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);
    }

4番目の質問:連絡先の選び方

isChooseContactフィールドから連絡先を選択するかどうかを決定します

4番目の質問:連絡先が追加されたかどうかを判断する方法

isAddContactフィールドを使用して連絡先が追加されているかどうかを確認します

デモダウンロード

APKダウンロード

おすすめ

転載: blog.csdn.net/az44yao/article/details/112690005