2010-12-05 20 views
4

Je souhaite charger tous les noms et numéros de téléphone de mes contacts dans l'adaptateur d'AutoCompleteTextView. Comment puis-je y parvenir? Par exemple, quand je tape "G", il affichera "Bon, < 111111>", "Bon, < 222222>" dans sa liste déroulante. Avec la démo d'api, je ne peux que mettre les DISPLAY_NAME dans le curseur de résultat. Je ne sais pas comment combiner les noms et les nombres en un seul curseur. Merci!comment combiner à la fois DISPLAY_NAME et NUMBER dans un CursorAdapter personnalisé?

codes de la démo api:

ContentResolver content = getContentResolver(); 
Cursor cursor = content.query(ContactsContract.Contacts.CONTENT_URI, 
    PEOPLE_PROJECTION, null, null, null); 
ContactListAdapter adapter = new ContactListAdapter(this, cursor); 
mAutoCompleteTextView.setAdapter(adapter); 

private static class ContactListAdapter extends CursorAdapter implements Filterable { 
    private ContentResolver mCR; 

    public ContactListAdapter(Context context, Cursor c) { 
     super(context, c); 
     mCR = context.getContentResolver(); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     final LayoutInflater inflater = LayoutInflater.from(context); 
     final TextView view = (TextView) inflater.inflate(
       android.R.layout.simple_dropdown_item_1line, parent, false); 
     view.setText(cursor.getString(1)); 
     return view; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     ((TextView) view).setText(cursor.getString(1)); 
    } 

    @Override 
    public String convertToString(Cursor cursor) { 
     return cursor.getString(1); 
    } 

    @Override 
    public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 
     if (getFilterQueryProvider() != null) { 
      return getFilterQueryProvider().runQuery(constraint); 
     } 
     StringBuilder buffer = null; 
     String[] args = null; 
     if (constraint != null) { 
      buffer = new StringBuilder(); 
      buffer.append("UPPER("); 
      buffer.append(ContactsContract.Contacts.DISPLAY_NAME); 
      buffer.append(") GLOB ?"); 
      args = new String[] { constraint.toString().toUpperCase() + "*" }; 
     } 
     return mCR.query(ContactsContract.Contacts.CONTENT_URI, PEOPLE_PROJECTION, 
       buffer == null ? null : buffer.toString(), args, null); 
    } 
} 

private static final String[] PEOPLE_PROJECTION = new String[] { 
    ContactsContract.Contacts._ID, 
    ContactsContract.Contacts.DISPLAY_NAME, 
    ContactsContract.Contacts.HAS_PHONE_NUMBER 
}; 
+0

toute aide s'il vous plaît? =) – yee

Répondre

0

Les chiffres devraient déjà faire partie du curseur. Récupérez-les comme ça. Ensuite, la méthode getPhoneNumbers, dans la même classe, doit à nouveau effectuer une nouvelle itération. Je ne sais pas s'il existe une meilleure façon de le faire en se liant à un curseur (dans la nouvelle API), mais cela fonctionne.

 public Long getPhoneNumbers(String id) { 
     Long number = new Long(0); 
     ContentResolver cr = this.context.getContentResolver(); 
     Cursor pCur = cr.query(
       ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
       null, 
       ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
       new String[]{id}, null); 
     pCur.moveToFirst(); 
     if (pCur.getCount() > 0){ 
      String num = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      num = num.replaceAll("-", ""); 
      number = Long.parseLong(num); 
     } 
     pCur.close(); 
     return number; 
    }