- サイドバーインデックスをサポート
- 中国語、数字、文字のあいまい検索をサポート
- すべての選択、単一選択の連絡先をサポート
- 連絡先が追加されているかどうかを確認するためのサポート
単一選択デモ
多肢選択式デモ
機能分析
ほとんどのコードは比較的単純なので、ここに貼り付けてスペースをとることはありません。いくつかの技術的なポイントのみを分析します。ソースコードを直接ダウンロードして観察することができます。
最初の質問:拼音への中国語の文字
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フィールドを使用して連絡先が追加されているかどうかを確認します