2010-04-13 7 views
4

J'ai créé une boîte AutoCompleteTextView qui affiche les noms de tous les contacts, mais après avoir regardé les API Android, il semble que ma méthode soit probablement inefficace.Android - Saisie semi-automatique avec les contacts

Actuellement, je saisis un curseur de tous les contacts, en plaçant chaque nom et chaque ID de contact dans deux tableaux différents, puis en passant le nom array à l'AutoCompleteTextView. Lorsqu'un utilisateur sélectionne un élément, je recherche quel ID le contact a sélectionné dans le second tableau d'id créé ci-dessus. Code ci-dessous:

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

Il doit y avoir une meilleure façon de le faire - au fond, je me bats pour voir comment je peux trouver quel élément un utilisateur sélectionné dans un AutoCompleteTextView. Des idées?

Cheers.

Répondre

1

Créez votre propre adaptateur de curseur et utilisez-le pour AutoCompleteTextView.

Il existe une fonction convertToString() dans CursorAdapter que vous devez remplacer pour obtenir les détails que vous souhaitez afficher dans TextView. Il vous donnera le curseur pointant sur la position sélectionnée en tant que paramètre.

Espérons que cela aide.

+0

Cheers, je suppose que ma question était plus une fois que le nom a été sélectionné, est de toute façon de dire si elle était dans la liste de saisie semi-automatique ou dois-je actualisez les contacts table de base de données pour une correspondance du nom écrit. Et j'ai trouvé la réponse à être le plus tard. Merci pour la poussée dans la bonne direction –

0

Si vous avez toujours l'instance de cette classe, vous devriez pouvoir rechercher dans le tableau que vous avez utilisé dans l'adaptateur pour rassembler les informations dont vous avez besoin.

Questions connexes