2011-01-05 5 views
2

Je développe actuellement une application qui doit rechercher un certain nombre de contacts (nom et photo) via leur numéro de téléphone. Cependant, cela prend plusieurs secondes (Pour chaque contact: Recherchez le contact via son numéro de téléphone, obtenez le nom du contact & photo).Android: Rechercher rapidement une liste de contacts

Quelle serait une bonne stratégie pour accélérer ce processus? Je me rends compte que je pourrais utiliser mon propre sqlite db qui contient une liste de exactement les noms et les photos dont j'ai besoin. Avec une telle base de données je pourrais seulement faire une requête, puis obtenir les données pour tous les contacts dont j'ai besoin immédiatement. Cependant, cela ajouterait un peu de frais généraux que j'espère éviter.

Existe-t-il une meilleure solution (parler: plus simple)?

Merci.

+0

Metter, pouvez-vous envoyer un code sur la façon dont vous y parvenir, peut-être que nous pouvons donner un aperçu de la façon de mieux optimiser ce que vous travaillez. – Webnet

Répondre

1

vous pouvez utiliser CursorAdapter et remplacer la méthode Bindview() par exemple:

@Override 
public void bindView(final View view, Context context, final Cursor cursor) { 
    holder = (ItemHolder) view.getTag(); 
    ImageView icon = holder.getImageView(); 
    TextView name = holder.getName(); 
    final TextView email = holder.getEmail(); 
    icon.setBackgroundResource(R.drawable.contact_icon); 
    name.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); 


    final int contactid = cursor.getInt(cursor.getColumnIndex("_id")); 
    mHandler.post(new Runnable() { 

     @Override 
     public void run() { 
      Cursor emailCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, "contact_id=?", new String[]{String.valueOf(contactid)}, null); 
      startManagingCursor(emailCursor); 
//   Log.i("cursor:", emailCursor.getCount()+""); 
      if(emailCursor!=null){ 

       if(emailCursor.getCount()==0){ 
        email.setText(""); 
       }else { 
        while(emailCursor.moveToNext()){ 
         String emails = emailCursor.getString(emailCursor.getColumnIndex("data1")); 
         email.setText(emails); 
        } 
       } 

      } 
      emailCursor.close(); 
     } 
    }); 

vous utiliseriez ContactsContract.CommonDataKinds.Phone.CONTENT_URI au lieu de ContactsContract.CommonDataKinds.Email.CONTENT_URI.

+0

Merci mon pote. Cette question a cependant 7 mois et le projet en question est depuis longtemps terminé. – metter

+0

@metter Je pense que c'est d'autant mieux que getmsg a répondu à cette question, puisque vous ne l'avez pas fait. ;-) – kay

0

Vous pouvez utiliser Hashmap pour mettre en cache les données, exécuter un thread d'arrière-plan pour mettre en cache les données de contacts dans HashMap et les extraire de hashmap lorsque cela est nécessaire. Cela réduira le temps de requête lorsque des informations sont nécessaires.

0

un autre exemple:

 ListView myListView = (ListView)findViewById(R.id.myListView); 

    Cursor cur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 

    startManagingCursor(cur); 


    ListAdapter adapter = new SimpleCursorAdapter(this, 
    android.R.layout.simple_list_item_2, 
    cur, 
    new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER},new int[] {android.R.id.text1, android.R.id.text2}); 
    myListView.setAdapter(adapter); 
Questions connexes