Android - автозаполнение с контактами - PullRequest
4 голосов
/ 13 апреля 2010

Я создал окно AutoCompleteTextView, в котором отображаются имена всех контактов, но после просмотра API-интерфейсов Android кажется, что мой метод, вероятно, довольно неэффективен.

В настоящее время я собираю курсор всех контактов, помещаю каждое имя и каждый идентификатор контакта в два разных массива, а затем передаю массив имен в AutoCompleteTextView. Когда пользователь выбирает элемент, я просматриваю, какой идентификатор контакт выбрал во втором массиве идентификаторов, созданном выше. Код ниже:

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

Должен быть лучший способ сделать это - в основном, я изо всех сил пытаюсь увидеть, как я могу найти, какой элемент пользователь выбрал в AutoCompleteTextView. Есть идеи?

Приветствие.

Ответы [ 3 ]

2 голосов
/ 07 марта 2011
1 голос
/ 14 апреля 2010

Создайте свой собственный адаптер курсора и используйте его для AutoCompleteTextView.

В CursorAdapter есть функция convertToString (), которую необходимо перезаписать, чтобы получить сведения, которые вы хотите отобразить в TextView. Это даст вам курсор, указывающий на выбранную позицию в качестве параметра.

Надеюсь, это поможет.

0 голосов
/ 29 июля 2010

Если у вас все еще есть экземпляр этого класса, вы сможете найти массив, который вы использовали в адаптере, для сбора необходимой информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...