Contacto orden alfabético, búsqueda difusa, selección

  • Índice de barra lateral de soporte
  • Soporte chino, número, búsqueda difusa de letras
  • Admite todos los contactos seleccionados y seleccionados
  • Soporte para verificar si el contacto se ha agregado

Demostración de opción única

Escriba la descripción de la imagen aquí

Demostración de opción múltiple

Escriba la descripción de la imagen aquí

Análisis de funciones

La mayor parte del código es relativamente simple, así que no lo pegaré aquí y ocuparé espacio. Solo analizo algunos puntos técnicos. Puedes descargar el código fuente directamente para observar.

La primera pregunta: caracteres chinos para pinyin

Depende de la biblioteca de tinipinina

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

Cuando obtenga el primer carácter chino y lo pase, se convertirá automáticamente en pinyin y luego tomará el primer carácter de pinyin.

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

Segunda pregunta: cómo ordenar los contactos de AZ

En la primera pregunta, obtuvimos la primera letra de cada contacto y clasificamos los contactos en el bucle en orden ascendente a través de compareTo del Comparator

/**
     * 把联系人按照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;
    }

La tercera pregunta: cómo mostrar las letras de clasificación de los contactos por orden alfabético.

En la segunda pregunta, ordenamos los contactos en orden alfabético ascendente. Aquí solo nos falta determinar si las primeras letras de los contactos son iguales, es decir, si la primera letra del primer contacto y el segundo contacto son diferentes, significa que no son del mismo tipo. Esto es para mostrar la letra de índice en el segundo contacto.

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

La cuarta pregunta: cómo buscar contactos.

Primero obtenga todos los contactos y luego busque nuevamente, coloque los contactos buscados en otra colección y luego envíelo a RecycleView para notificar la actualización

/**
     * 搜索联系人
     *
     * @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);
    }

La cuarta pregunta: cómo elegir un contacto.

Determine si desea seleccionar un contacto a través del campo isChooseContact

La cuarta pregunta: cómo juzgar si el contacto se ha agregado

Determine si se ha agregado un contacto a través del campo isAddContact

Descarga demo

Descargar APK

Supongo que te gusta

Origin blog.csdn.net/az44yao/article/details/112690005
Recomendado
Clasificación