seleccionando el contacto desde la vista de texto de autocompletar

Quiero seleccionar el contacto usando la vista de texto de autocompletar para enviar sms. Casi he logrado lo que quiero, pero para un problema de un minuto como puedes ver en la imagen. ¿Cómo puedo resolver eso?

activity_contact_with_auto.xml

     

custcontview.xml

       

Código

 public class ContactWithAuto extends Activity { private ArrayList<Map> mPeopleList; private SimpleAdapter mAdapter; private AutoCompleteTextView mTxtPhoneNo; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contact_with_auto); mPeopleList = new ArrayList<Map>(); PopulatePeopleList(); mTxtPhoneNo = (AutoCompleteTextView) findViewById(R.id.mmWhoNo); mAdapter = new SimpleAdapter(this, mPeopleList, R.layout.custcontview, new String[] { "Name", "Phone", "Type" }, new int[] { R.id.ccontName, R.id.ccontNo, R.id.ccontType }); mTxtPhoneNo.setAdapter(mAdapter); } public void PopulatePeopleList() { mPeopleList.clear(); Cursor people = getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null); while (people.moveToNext()) { String contactName = people.getString(people .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); String contactId = people.getString(people .getColumnIndex(ContactsContract.Contacts._ID)); String hasPhone = people .getString(people .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); if ((Integer.parseInt(hasPhone) > 0)){ // You know have the number so now query it like this Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null); while (phones.moveToNext()){ //store numbers and display a dialog letting the user select which. String phoneNumber = phones.getString( phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER)); String numberType = phones.getString(phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.TYPE)); Map NamePhoneType = new HashMap(); NamePhoneType.put("Name", contactName); NamePhoneType.put("Phone", phoneNumber); if(numberType.equals("0")) NamePhoneType.put("Type", "Work"); else if(numberType.equals("1")) NamePhoneType.put("Type", "Home"); else if(numberType.equals("2")) NamePhoneType.put("Type", "Mobile"); else NamePhoneType.put("Type", "Other"); //Then add this map to the list. mPeopleList.add(NamePhoneType); } phones.close(); } } people.close(); startManagingCursor(people); } public void onItemClick(AdapterView av, View v, int index, long arg){ Map map = (Map) av.getItemAtPosition(index); Iterator myVeryOwnIterator = map.keySet().iterator(); while(myVeryOwnIterator.hasNext()) { String key=(String)myVeryOwnIterator.next(); String value=(String)map.get(key); mTxtPhoneNo.setText(value); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_contact_with_auto, menu); return true; } } 

Imagen

captura de pantalla

Agregue un onItemClickListener para AutoCompleteTextView en lugar de tenerlo como una función independiente.

  mTxtPhoneNo.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView av, View arg1, int index, long arg3) { Map map = (Map) av.getItemAtPosition(index); String name = map.get("Name"); String number = map.get("Phone"); mTxtPhoneNo.setText(""+name+"<"+number+">"); } }); 

o implemente OnItemClickListener para su actividad y conjunto

 mTxtPhoneNo.setOnItemClickListener(this); 

El resultado que tiene actualmente parece ser el resultado estándar del método HashMap.toString. Por lo tanto, debe hacer su propia implementación de HashMap y anular el método de String.

Con AutoCompeleteTextView puede ser útil hacer lo que dijo @ user936414, pero puede ser un problema si tienes la aplicación más grande, incluso más con un MultiAutoCompeleteTextView, por lo que se recomienda reemplazar el método toString creando un HashMap “personalizado” como ese:

 public class ContactMap extends HashMap { /* * (non-Javadoc) * * @see java.util.AbstractMap#toString() */ @Override public String toString() { if (isEmpty()) { return "{}"; } StringBuilder buffer = new StringBuilder(size() * 28); Iterator> it = entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = it.next(); Object key = entry.getKey(); if (key == "Name") { Object value = entry.getValue(); buffer.append(value); } else { if (key == "Phone") buffer.append("<"); Object value = entry.getValue(); if (value != this) { buffer.append(value); } else { buffer.append("(this Map)"); } if (key == "Phone") buffer.append(">"); } } return buffer.toString(); } } 

y úsalo así

  // Using our custom HashMap ContactMap NamePhoneType = new ContactMap();