views:

501

answers:

2

I've created an AutoCompleteTextView box that displays the names of all contacts, but after looking in the Android APIs, it seems my method is probably quite inefficient.

Currently I am grabbing a cursor of the all the contacts, placing each name and each contact id into two different arrays, then passing the name array to the AutoCompleteTextView. When a user selects an item, I lookup which ID the contact selected in the second id array created above. Code below:

private ContactNames mContactData;

// Fill the autocomplete textbox
Cursor contactsCursor = grabContacts();
mContactData = new ContactNames(contactsCursor);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.contact_name, mContactData.namesArray);
mNameText.setAdapter(adapter);

private class ContactNames {
    private String[] namesArray;
    private long[] idsArray;        

    private ContactNames(Cursor cur) {
        namesArray = new String[cur.getCount()];
        idsArray = new long[cur.getCount()];

        String name; 
        Long contactid;
        // Get column id's
        int nameColumn = cur.getColumnIndex(People.NAME); 
        int idColumn = cur.getColumnIndex(People._ID);
        int i=0;
        cur.moveToFirst();
        // Check that there are actually any contacts returned by the cursor
        if (cur.getCount()>0){
            do {
                // Get the field values
                name = cur.getString(nameColumn);
                contactid = Long.parseLong(cur.getString(idColumn));
                // Do something with the values. 
                namesArray[i] = name;
                idsArray[i] = contactid;
                i++;
            } while (cur.moveToNext());
        }
    }

    private long search(String name){
        // Lookup name in the contact list that we've put in an array
        int indexOfName = Arrays.binarySearch(namesArray, name);
        long contact = 0;
        if (indexOfName>=0)
        {
            contact = idsArray[indexOfName];
        }
        return contact;
    }
}

private Cursor grabContacts(){
    // Form an array specifying which columns to return. 
    String[] projection = new String[] {People._ID, People.NAME};

    // Get the base URI for the People table in the Contacts content provider.
    Uri contacts =  People.CONTENT_URI;

    // Make the query. 
    Cursor managedCursor = managedQuery(contacts, projection, null, null, People.NAME + " ASC"); // Put the results in ascending order by name
    startManagingCursor(managedCursor);
    return managedCursor;
}

There must be a better way of doing this - basically I'm struggling to see how I can find which item a user selected in an AutoCompleteTextView. Any ideas?

Cheers.

+1  A: 

Build your own cursor adapter and use it for AutoCompleteTextView.

There is a convertToString() function in CursorAdapter that you need to overwrite to get the details that you want to be displayed in the TextView. It will give you the cursor pointing to the selected position as a parameter.

Hope this helps.

Karan
Cheers, I guess my question was more once a name has been selected, is there anyway of telling if it was in the autocomplete list or do I have to requery the contacts database table for a match of the name written. And I found the answer to be the later.Thanks for the push in the right direction
The Salt
A: 

If you still have the instance of that class you should be able to search through the array that you used in the adapter to gather the info you need.

WeldFire