2017-01-27 1 views
0

J'utilise le didacticiel https://trinitytuts.com/get-contact-list-and-show-in-custom-listview-android/# pour obtenir la liste de contacts en mode liste. Cela fonctionne bien mais donne des contacts en double. Quelqu'un peut-il guider sur ceci pour résoudre et obtenir le contact une seule fois dans la liste.Supprimer les contacts en double dans la liste personnalisée

code

pour MainActivity est comme ci-dessous:

import android.app.Activity; 
import android.content.ContentResolver; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.SearchView; 
import android.widget.Toast; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 


public class MainActivity extends Activity { 

    // ArrayList 
    ArrayList<SelectUser> selectUsers; 
    List<SelectUser> temp; 
    // Contact List 
    ListView listView; 
    // Cursor to load contacts list 
    Cursor phones, email; 

    // Pop up 
    ContentResolver resolver; 
    SearchView search; 
    SelectUserAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     selectUsers = new ArrayList<SelectUser>(); 
     resolver = this.getContentResolver(); 
     listView = (ListView) findViewById(R.id.contacts_list); 

     phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); 
     LoadContact loadContact = new LoadContact(); 
     loadContact.execute(); 

     search = (SearchView) findViewById(R.id.searchView); 

     //*** setOnQueryTextListener *** 
     search.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

      @Override 
      public boolean onQueryTextSubmit(String query) { 
       // TODO Auto-generated method stub 

       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       // TODO Auto-generated method stub 
       adapter.filter(newText); 
       return false; 
      } 
     }); 
    } 

    // Load data on background 
    class LoadContact extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 

     @Override 
     protected Void doInBackground(Void... voids) { 
      // Get Contact list from Phone 

      if (phones != null) { 
       Log.e("count", "" + phones.getCount()); 
       if (phones.getCount() == 0) { 
        Toast.makeText(MainActivity.this, "No contacts in your contact list.", Toast.LENGTH_LONG).show(); 
       } 

       while (phones.moveToNext()) { 
        Bitmap bit_thumb = null; 
        String id = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); 
        String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
        String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        String EmailAddr = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA2)); 
        String image_thumb = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_THUMBNAIL_URI)); 
        try { 
         if (image_thumb != null) { 
          bit_thumb = MediaStore.Images.Media.getBitmap(resolver, Uri.parse(image_thumb)); 
         } else { 
          Log.e("No Image Thumb", "--------------"); 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

        SelectUser selectUser = new SelectUser(); 
        selectUser.setThumb(bit_thumb); 
        selectUser.setName(name); 
        selectUser.setPhone(phoneNumber); 
        selectUser.setEmail(id); 
        selectUser.setCheckedBox(false); 
        selectUsers.add(selectUser); 
       } 
      } else { 
       Log.e("Cursor close 1", "----------------"); 
      } 
      //phones.close(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      super.onPostExecute(aVoid); 
      adapter = new SelectUserAdapter(selectUsers, MainActivity.this); 
      listView.setAdapter(adapter); 

      // Select item on listclick 
      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

        Log.e("search", "here---------------- listener"); 

        SelectUser data = selectUsers.get(i); 
       } 
      }); 

      listView.setFastScrollEnabled(true); 
     } 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     phones.close(); 
    } 
} 

Répondre

2

Pourquoi ne pas utiliser un Set Essayez de stocker vos contacts dans un un Object et que Object dans un Set?. N'oubliez pas de remplacer la méthode equals de cette Object en fonction de laquelle vous devez éliminer les doublons.

Plus de lire ici http://www.java2novice.com/java-collections-and-util/hashset/duplicate/

+0

si je viens modifier Arraylist à Hashset en gardant tout pareil, la taille de la liste est passée de 297 à 30. Donc, en sautant la plupart des contacts à ajouter dans le jeu. Comment cela peut-il être utilisé – Panache

+0

Vous devrez ajouter vos contacts pour les afficher dans un objet Ensuite, dans l'objet contacts, vous devez remplacer les méthodes égales et en fonction de tous les critères, vous devrez retourner vrai ou faux. HashSet. – Nilesh

0

Vous voyez les doublons parce que vous vous interrogez sur une liste des téléphones, pas des contacts, si un contact a plus d'un téléphone, vous obtiendrez le même contact multiple fois - un pour chaque numéro de téléphone.

Vous devez décider comment vous souhaitez gérer les contacts avec plusieurs téléphones, ainsi que les contacts sans téléphone (actuellement, vous n'affichez pas de contacts sans téléphone).

En supposant vous voulez une ligne par contact, affichant uniquement les contacts qui ont des téléphones, et l'affichage tous les téléphones pour ce contact sur la même ligne, vous devrez réviser votre code un peu:

  1. L'objet SelectUser doit accepter une liste de téléphones, pas seulement un.
  2. le champ selectUsers doit être HashMap<Long, SelectUser> et non ArrayList<SelectUser>
  3. String id = ... devrait effectivement être Long id = ...

Ensuite, dans votre curseur iterator faire ceci:

if (selectUsers.containsKey(id)) { 
    SelectUser selectUser = selectUsers.get(id); 
    selectUser.addPhone(phoneNumber); // new method you need to implement 
} else { 
    SelectUser selectUser = new SelectUser(); 
    selectUser.setThumb(bit_thumb); 
    selectUser.setName(name); 
    selectUser.setPhone(phoneNumber); 
    selectUser.setEmail(id); // Email can't be retrieved from the phones table, see below 
    selectUser.setCheckedBox(false); 
    selectUsers.add(selectUser); 
} 

post-scriptum Vous ne pouvez pas lire les champs CommonDataKinds.Email lorsque vous interrogez la table CommonDataKinds.Phone. Si vous souhaitez lire à la fois les téléphones et les e-mails sur la même requête, vous devez interroger la table ContactsContract.Data et sélectionner Data.MIMETYPE + ' = ' + Phone.CONTENT_TYPE + ' OR ' + Data.MIMETYPE + ' = ' + Email.CONTENT_TYPE. Cela vous donnera un curseur sur des lignes qui sont soit téléphone ou par e-mail (vous pouvez utiliser le Data.MIMETYPE pour vérifier que l'on est-il

Voir plus d'informations ici. https://developer.android.com/reference/android/provider/ContactsContract.Data.html https://stackoverflow.com/a/31864811/819355