¿Cómo evitar el nombre de contacto duplicado (datos) mientras se carga la información de contacto a listview?

Estoy rellenando los detalles de la lista de contactos para ver la lista correctamente. Mi código:

String order = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"; Cursor curLog = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,order); 

¿Cómo puedo evitar los datos duplicados en la vista de lista como los detalles de contacto se repite si su contacto unido, es decir, unido con el teléfono y Google? . La pantalla es como Introduzca aquí la descripción de la imagen

Quiero seleccionar programaticamente sólo 1 nombre no los dos? ¿Alguna idea de cómo puedo seleccionar?

He utilizado una manera áspera de evitar este problema que me ayudó tanto y que trabajaba agradable.

es decir

Utilice la base de datos local (SQLite) para evitar datos duplicados haciendo que el número de teléfono sea único.

He hecho un SQLite DB para manejar este problema:

ContactMerger.java:

 public class ContactMerger { private static final String CONTACT_TABLE = "_contact_table"; private static final String CONTACT_ID = "_contactId"; private static final String CONTACT_NAME = "_contactName"; private static final String CONTACT_MOBILE_NUMBER = "_contactNumber"; private static final String CONTACT_DATE = "_contactDate"; private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "DB_Contact"; private final Context context; private SQLiteDatabase ourDatabase; private DbHelper ourHelper; private class DbHelper extends SQLiteOpenHelper { public DbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub String contactQuery = "CREATE TABLE " + CONTACT_TABLE + " (" + CONTACT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + CONTACT_NAME + " TEXT NOT NULL, " + CONTACT_DATE + " TEXT NOT NULL, " + CONTACT_MOBILE_NUMBER + " TEXT NOT NULL UNIQUE);"; db.execSQL(contactQuery); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub db.execSQL("DROP TABLE IF EXISTS " + CONTACT_TABLE); onCreate(db); } } public ContactMerger(Context context) { this.context = context; } public ContactMerger open() throws SQLException { ourHelper = new DbHelper(context); ourDatabase = ourHelper.getWritableDatabase(); return this; } public void close() { ourHelper.close(); } // Insert Data to Contact Table public long insertContacts(String name, String number, String date) throws SQLException { ContentValues cv = new ContentValues(); cv.put(CONTACT_NAME, name); cv.put(CONTACT_DATE, date); cv.put(CONTACT_MOBILE_NUMBER, number); Log.d("Insert Data", cv.toString()); return ourDatabase.insert(CONTACT_TABLE, null, cv); } //Get Contact details from Contact Table public ArrayList<ContactHolder> getContactDetails() throws Exception{ ArrayList<ContactHolder> contactDetails = new ArrayList<ContactHolder>(); String[] columns = new String[] { CONTACT_ID, CONTACT_NAME, CONTACT_DATE, CONTACT_MOBILE_NUMBER }; Cursor c = ourDatabase.query(CONTACT_TABLE, columns, null, null, null,null, null); int iContactName = c.getColumnIndex(CONTACT_NAME); int iContactDate = c.getColumnIndex(CONTACT_DATE); int iContactMobileNumber = c.getColumnIndex(CONTACT_MOBILE_NUMBER); for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { ContactHolder data = new ContactHolder(); data.setName(c.getString(iContactName)); data.setDate(c.getString(iContactDate)); data.setNumber(c.getString(iContactMobileNumber)); contactDetails.add(data); } return contactDetails; } } 

Aquí ContactHolder es sólo una clase getter / setter para manejar entidades de contacto.

Primero inserté toda la información de contacto una vez en MainActivity con la ayuda de un hilo de fondo. Evita insertar la información de contacto varias veces.

Algo como:

 private ArrayList<ContactHolder> contactHolder; private void setCallLogs(Cursor managedCursor) { contactHolder = new ArrayList<ContactHolder>(); int _number = managedCursor .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); int _name = managedCursor .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); int _id = managedCursor .getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID); while (managedCursor.moveToNext()) { ContactHolder holder = new ContactHolder(); holder.setNumber(managedCursor.getString(_number)); holder.setName(managedCursor.getString(_name)); holder.setDate(managedCursor.getString(_id)); contactHolder.add(holder); } Thread t = new Thread(new Runnable() { @Override public void run() { for(int i=0; i<contactHolder.size(); i++){ try{ ContactMerger merger = new ContactMerger(HomeActivity.this); merger.open(); merger.insertContacts(contactHolder.get(i).getName(), contactHolder.get(i).getNumber(), contactHolder.get(i).getdate()); merger.close(); } catch(Exception e){ e.printStackTrace(); } } } }); t.start(); } 

Por último gtt toda la información de contacto dentro de un Asynctask (doInbackground ()) y poner en el adaptador / listview en su método onPostExecute () en la clase que quiero mostrar.

Aquí:

 @Override protected ArrayList<ContactHolder> doInBackground(String... parameters) { ArrayList<ContactHolder> filterContacts = new ArrayList<ContactHolder>(); ContactMerger merger = new ContactMerger(Aaja_Contact.this); merger.open(); try { filterContacts = merger.getContactDetails(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } merger.close(); return filterContacts; } 

Necesita recuperar los datos del Cursor a HashSet (que no permite duplicar itmes) y, a continuación, pasar el objeto HashSet a su adaptador ListView

Esta es una solución de volcado, pero le ayudará a:

 ListView listView; Set<String> listItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); listItems = new HashSet<String>(); String order = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"; Cursor curLog = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,order); if(curLog != null) { while(curLog.moveToNext()) { String str = curLog.getString(curLog.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY)); listItems.add(str); } } String listString = listItems.toString(); listString = listString.substring(1,listString.length()-1); String[] newList = listString.split(", "); ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, newList); listView.setAdapter(adapter); } 

Buena suerte..

Creo que esto puede suceder si el número de contacto se almacena de dos formas / formatos diferentes: por ejemplo, en su caso el número de Akshay se puede guardar como 982-0123456 y 9820123456

¿Ha intentado mostrar el número junto con el nombre incluyendo el número también en la vista de lista?

Puesto que usted está consultando Phone.CONTENT_URI , Phone.CONTENT_URI que usted está buscando contactos con número de teléfono. Entonces usted puede utilizar ContactsContract.Contacts.CONTENT_URI

 String order = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"; Cursor curLog = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, ContactsContract.Contacts.HAS_PHONE_NUMBER + "=?", new String[] { "1" }, order); 

Su porque el listview está mostrando contactos normales así como whatsapp (o como esto) los contactos ligados. Lo mejor es almacenar todos los contactos en una base de datos y luego recuperar los contactos mediante el comando "select distinct …" de SQL.

  • Cómo obtener información de usuario de la lista de contactos de Android
  • Selecciona varios contactos de la agenda telefónica en android
  • Permiso de negación: apertura del proveedor com.android.providers.contacts.ContactsProvider2 de ProcessRecord en Android Studio
  • Obtener el número de teléfono de la URI de búsqueda
  • Insertar una nueva foto de contacto para Android
  • Recuperar un número de teléfono con ContactsContract en Android: la función no funciona
  • ¿Es posible excluir contactos SIM cuando se utiliza Intent.ACTION_PICK?
  • Exportar los contactos como archivo VCF
  • No se puede insertar los contactos de android mediante programación en el dispositivo de Android
  • Cómo obtener todos los contactos nombre, apellido, correo electrónico, número de teléfono, etc, sin duplicados
  • ¿Cómo obtener el nombre y el apellido de los contactos de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.