AutoComplete with name and number as in native sms app Android

前端 未结 2 741
青春惊慌失措
青春惊慌失措 2020-12-16 07:51

I want to add an AutoCompleteTextView in my app and search contacts by name and number as done in the native SMS app with android. I have looked on the internet

相关标签:
2条回答
  • 2020-12-16 08:40

    The AutoCompleteTextView was completed using the code by @K_Anas. Since it returns a (key, value) pair, I used the following to display only the number of the selected item:

    @Override
    public void onItemClick(AdapterView<?> av, View v, int index, long arg) {
        Map<String, String> map = (Map<String, String>) av.getItemAtPosition(index);
        Iterator<String> myVeryOwnIterator = map.keySet().iterator();
              while(myVeryOwnIterator.hasNext()) {
                String key=(String)myVeryOwnIterator.next();
                String value=(String)map.get(key);
                mTxtPhoneNo.setText(value);
            }               
        }
    });
    

    Things achieved in this question:

    • AutoCompleteTextView to load contacts in the format just as in the picture in the question above.
    • Setting Text as the phone number of the selected value.
    0 讨论(0)
  • 2020-12-16 08:44

    I have already done something similar in the past that's what I've done:

    note: you will get Autocompletion after taping two character

    The layout file uses an AutoCompleteView, its basically an EditText with a dropdown list that appears as you type in it. The .xml file in youe example looks like this:

    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
    android:orientation="vertical"
    
    android:layout_width="fill_parent"
    
    android:layout_height="fill_parent"
    
    >
    
    <AutoCompleteTextView
    
    android:id="@+id/mmWhoNo"
    
    android:layout_width="fill_parent"
    
    android:layout_height="wrap_content"
    
    android:hint="To...."
    
    >
    
    </AutoCompleteTextView>
    
    </LinearLayout>
    

    To create the custom view used in the AutoCompleteView you have to declare another .xml file called custcontview.xml and it will looks like this:

    <TextView
        android:id="@+id/ccontName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textColor="#A5000000"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    
    <TextView
        android:id="@+id/ccontNo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/ccontName"
        android:text="Medium Text"
        android:textColor="#A5000000"
        android:textAppearance="?android:attr/textAppearanceMedium" />
    
    <TextView
        android:id="@+id/ccontType"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/ccontNo"
        android:layout_alignParentRight="true"
        android:layout_marginRight="14dp"
        android:text="Small Text"
        android:textColor="#A5000000"
        android:textAppearance="?android:attr/textAppearanceSmall" />
    

    now In your Activity:

    public class ContactActivity extends Activity {
    
        private ArrayList<Map<String, String>> mPeopleList;
    
        private SimpleAdapter mAdapter;
        private AutoCompleteTextView mTxtPhoneNo;
    
    /** Called when the activity is first created. */
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            mPeopleList = new ArrayList<Map<String, String>>();
            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<String, String> NamePhoneType = new HashMap<String, String>();
    
        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);
        }
        }
    

    Don't forget to add

    <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
    

    in your manifest

    0 讨论(0)
提交回复
热议问题