Tengo el siguiente código para recuperar una lista de contactos con Nombre + Número de teléfono:
@SuppressLint("Range") fun getNamePhoneDetails(): ArrayList<List<String>>? { val names = ArrayList<List<String>>() val cr = contentResolver val cur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null) if (cur!!.count > 0) { while (cur.moveToNext()) { val id = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NAME_RAW_CONTACT_ID)) val name = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)) val number = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)) names.add(listOf(id, name, number)) } } return names }La salida es correcta una vez que ningún contacto tiene dos números de teléfono. Sin embargo, una vez que cualquier contacto tiene dos números de teléfono, obtengo el contacto dos veces. Tiene la misma identificación y nombre, pero un número de teléfono diferente. ¿Cómo puedo hacer que la lista devuelta no tenga un contacto dos veces sino todos los números de teléfono dentro de una lista?
Algo como
[1, Name Name, [phonenumber1, phonenumber2]],[2, Name Name, [phonenumber1]]
Entonces podría iterar a través de la lista de números de teléfono y tener todos los números como cadenas válidas.
Debería más bien crear un Objeto POJO y que asignarle los datos y devolver una lista de ese Objeto POJO y luego puede hacer uso de una extensión distinta en la lista para obtener un resultado filtrado de la forma que desee. Así es como puedes lograr lo que quieres:
Crear un objeto POJO:
data class Contact( val id : String , val name : String, val number : String)Y luego, al recuperar los datos, puede hacer lo siguiente:
@SuppressLint("Range") fun getNamePhoneDetails(): MutableList<Contact>? { val names = MutableList<Contact>() val cr = contentResolver val cur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null) if (cur!!.count > 0) { while (cur.moveToNext()) { val id = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NAME_RAW_CONTACT_ID)) val name = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)) val number = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)) names.add(Contact(id , name , number)) } } return names }Y luego, mientras recupera los datos, solo necesita filtrar la lista de la siguiente manera:
val list = getNamePhoneDetails() list.distinctBy { it.number }.forEach { println(it) }