Как объединить оба DISPLAY_NAME и NUMBER в настраиваемом CursorAdapter?

Я хочу загрузить все имена и телефонные номера моих контактов в адаптер AutoCompleteTextView. Как я могу это достичь? Например, когда я набираю «G», в раскрывающемся списке он отобразит «Хорошо, <111111>», «Хорошо, <222222>».

С api demo, я могу поместить DISPLAY_NAMEs в результат. Я не знаю, как объединить оба имени и числа в один курсор. благодаря!

Коды из демонстрации 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 }; 

Цифры должны быть уже частью курсора. Извлеките их так.

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

Тогда метод getPhoneNumbers, в том же классе, к счастью должен снова повторить. Не уверен, есть ли лучший способ сделать это, привязавшись к курсору (в новом api), но он работает.

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