Comment éviter le double nom de contact (données) pendant le chargement des informations de contact à listview?

Je dépasse les détails de la liste de contacts pour afficher la liste avec succès. Mon code:

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

Comment puis-je éviter les données en double dans la vue Liste lorsque les détails de contact se répètent si son contact joint est associé à un téléphone et à Google? . L'écran est comme Entrez la description de l'image ici

  • Effets du rembourrage négatif
  • Comment supprimer l'application des listes d'applications sur Android Developer Console
  • Auditeur vs gestionnaire dans Android
  • Comment ajouter le «Pack d'icônes de la barre d'action» à Android Studio
  • Paramètre de passe Android pour Activité Native
  • Comment modifier le titre des activités dans attach ()
  • Je veux sélectionner par programme uniquement 1 nom et non les deux? Toute idée comment je peux choisir?

  • Android NDK déborde Dalvik JNI tableau de référence local
  • Question théorique: charger un fichier externe XML-Layout dans Android
  • Positionnement MediaController sur VideoView
  • Impossible d'utiliser Eclipse's Scrapbook dans un projet Android
  • Comment faire pour que le texte disparaisse dans Android?
  • Imprime le contenu d'un Bundle dans Logcat?
  • 5 Solutions collect form web for “Comment éviter le double nom de contact (données) pendant le chargement des informations de contact à listview?”

    J'ai utilisé une façon difficile d'éviter ce problème qui m'a beaucoup aidé et fonctionne bien.

    c'est à dire

    Utilisez la base de données locale (SQLite) pour éviter les données en double en rendant le numéro de téléphone unique.

    J'ai créé un SQLite DB pour résoudre ce problème:

    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; } } 

    Here ContactHolder est juste une classe getter / setter pour gérer les entités de contact.

    D'abord, j'ai inséré toutes les informations de contact une fois dans ma MainActivity à l'aide d'un thread d'arrière-plan. Il empêche d'insérer les informations de contact à plusieurs reprises.

    Quelque chose comme:

     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(); } 

    Enfin, j'ai toutes les informations de contact dans un Asynctask (doInbackground ()) et met dans adapter / listview dans sa méthode onPostExecute () dans la classe que je souhaite montrer.

    Ici:

     @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; } 

    Vous devez récupérer les données depuis le Cursor vers HashSet (qui ne permet pas les itmes en double) puis passer l'objet HashSet à l'adaptateur de votre ListView

    Il s'agit d'une solution de vidage, mais cela vous aidera:

     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); } 

    Bonne chance..

    Je crois que cela peut se produire si le numéro de contact est stocké de deux façons / formats différents: par exemple, dans votre cas, le numéro pour Akshay peut être enregistré sous 982-0123456 et 9820123456

    Avez-vous essayé d'afficher le numéro avec le nom en incluant le numéro dans la vue de liste?

    Puisque vous interrogez Phone.CONTENT_URI , je suppose que vous recherchez des contacts avec un numéro de téléphone .. alors vous pouvez utiliser 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); 

    C'est parce que la liste affiche des contacts normaux ainsi que des contacts liés à WhatsApp (ou comme ça). Le mieux est de stocker tous les contacts dans une base de données, puis de récupérer les contacts à l'aide de la commande "select distinct …" de SQL.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.