2010-12-05 5 views
4

Ich möchte alle Namen und Telefonnummern meiner Kontakte in einen AutoCompleteTextView-Adapter laden. Wie kann ich das erreichen? Wenn ich beispielsweise "G" eintippe, wird in der Dropdown-Liste "Gut, < 111111>", "Gut, < 222222>" angezeigt.Wie kombiniere ich DISPLAY_NAME und NUMBER in einem benutzerdefinierten CursorAdapter?

mit der API-Demo kann ich nur die DISPLAY_NAMEs in den Ergebnis-Cursor setzen. Ich weiß nicht, wie man Namen und Zahlen zu einem Cursor zusammenfügt. Vielen Dank!

Codes aus der api Demo:

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

Hilfe bitte? =) – yee

Antwort

0

Die Zahlen sollten bereits Teil der Cursor sein. Nimm sie so auf.

final long phoneNumber;// = c.getColumnIndex(People.NUMBER_KEY); 
     if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0){ 
      id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
      int nameColumn = cursor.getColumnIndex(People.NAME); 
      int numberKeyColumn = cursor.getColumnIndex(People.NUMBER_KEY);    
      phoneNumber = this.getPhoneNumbers(id); }   

Dann muss die getPhoneNumbers-Methode, in der gleichen Klasse, leider erneut durchlaufen. Nicht sicher, ob es eine bessere Möglichkeit gibt, dies durch Bindung an einen Cursor (in der neuen API) zu tun, aber es funktioniert.

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