2010-10-07 23 views
5

J'ai une liste de contacts que j'ai obtenus à partir de l'exemple Android ContactManager. Cette liste apparaît bien, mais je n'arrive pas à comprendre comment obtenir des informations à partir de l'élément sélectionné, comme "nom" et "numéro de téléphone".getItemAtPosition() Comment obtenir des données lisibles à partir de l'élément sélectionné dans un ListView

Je peux obtenir la position sélectionnée, mais le résultat de mContactList.getItemAtPosition (position) est un ContentResolver $ CursorWrapperInner et cela n'a vraiment aucun sens pour moi. Je ne peux pas avoir de tête ou de queue à cause de ça.

Quelqu'un sait comment je peux obtenir le nom/id/numéro de téléphone de l'élément sélectionné dans la liste?

Voici mon code.

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    Log.v(TAG, "Activity State: onCreate()"); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.choose_contact); 

    // Obtain handles to UI objects 
    mAddAccountButton = (Button) findViewById(R.id.addContactButton); 
    mContactList = (ListView) findViewById(R.id.contactList); 
    mShowInvisibleControl = (CheckBox) findViewById(R.id.showInvisible); 

    // Initialize class properties 
    mShowInvisible = false; 
    mShowInvisibleControl.setChecked(mShowInvisible); 
    mContactList.setOnItemClickListener(new OnItemClickListener() 
    { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { 
     addContactAt(position); 
     } 
    }); 
    mShowInvisibleControl.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      Log.d(TAG, "mShowInvisibleControl changed: " + isChecked); 
      mShowInvisible = isChecked; 
      populateContactList(); 
     } 
    }); 

    // Populate the contact list 
    populateContactList(); 

} 

/** 
* Populate the contact list based on account currently selected in the account spinner. 
*/ 
private SimpleCursorAdapter adapter; 
private void populateContactList() { 
    // Build adapter with contact entries 
    Cursor cursor = getContacts(); 
    String[] fields = new String[] { 
      ContactsContract.Data.DISPLAY_NAME 
    }; 
    adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor, 
      fields, new int[] {R.id.contactEntryText}); 
    mContactList.setAdapter(adapter); 
} 

/** 
* Obtains the contact list for the currently selected account. 
* 
* @return A cursor for for accessing the contact list. 
*/ 
private Cursor getContacts() 
{ 
    // Run query 
    Uri uri = ContactsContract.Contacts.CONTENT_URI; 
    String[] projection = new String[] { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME 
    }; 
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + 
      (mShowInvisible ? "0" : "1") + "'"; 
    String[] selectionArgs = null; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

    return managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
} 

private void addContactAt(int position) 
{ 
Object o = mContactList.getItemAtPosition(position); 
} 

} `

Répondre

5

BOOM! Je compris. Fondamentalement, vous obtenez le numéro de position de l'événement click, puis dans mon addContatAt() vous utilisez cette position pour rechercher dans le curseur le champ que vous voulez. Dans mon cas, je voulais le nom d'affichage.

Je suis habitué à faire les choses dans Flex, cette entreprise de curseur est différent pour moi :)

Quoi qu'il en soit, pour les autres voici mon code:

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    Log.v(TAG, "Activity State: onCreate()"); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.choose_contact); 

    // Obtain handles to UI objects 
    mAddAccountButton = (Button) findViewById(R.id.addContactButton); 
    mContactList = (ListView) findViewById(R.id.contactList); 
    mShowInvisibleControl = (CheckBox) findViewById(R.id.showInvisible); 

    // Initialize class properties 
    mShowInvisible = false; 
    mShowInvisibleControl.setChecked(mShowInvisible); 
    mContactList.setOnItemClickListener(new OnItemClickListener() 
    { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { 
      addContactAt(position); 
     } 
    }); 
    mShowInvisibleControl.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      Log.d(TAG, "mShowInvisibleControl changed: " + isChecked); 
      mShowInvisible = isChecked; 
      populateContactList(); 
     } 
    }); 

    // Populate the contact list 
    populateContactList(); 

} 

/** 
* Populate the contact list based on account currently selected in the account spinner. 
*/ 
private SimpleCursorAdapter adapter; 
private void populateContactList() { 
    // Build adapter with contact entries 
    contactsCursor = getContacts(); 
    String[] fields = new String[] { 
      ContactsContract.Data.DISPLAY_NAME 
    }; 
    adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, contactsCursor, 
      fields, new int[] {R.id.contactEntryText}); 
    mContactList.setAdapter(adapter); 
} 

/** 
* Obtains the contact list for the currently selected account. 
* 
* @return A cursor for for accessing the contact list. 
*/ 
private Cursor getContacts() 
{ 
    // Run query 
    Uri uri = ContactsContract.Contacts.CONTENT_URI; 
    String[] projection = new String[] { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME 
    }; 
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + 
      (mShowInvisible ? "0" : "1") + "'"; 
    String[] selectionArgs = null; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

    return managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
} 

private void addContactAt(int position) 
{ 
    contactsCursor.moveToPosition(position); 
    String name = contactsCursor.getString(
      contactsCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
} 
} 
4

Hmm - vous déconner avec le curseur de votre AdapterView derrière son dos, ce qui n'est pas toujours une bonne idée. L'alternative consiste à appeler parent.getItemAtPosition (position) dans votre gestionnaire onItemClick et à convertir le résultat en curseur; il pointera sur la ligne correspondant à l'élément sur lequel vous avez cliqué.

+0

Ce retournera exactement la même 'Cursor' objet – Vasiliy

14
@Override 
protected void onListItemClick(ListView l, View v, int position, long ida) { 
    super.onListItemClick(l, v, position, ida); 

    Cursor mycursor = (Cursor) getListView().getItemAtPosition(position); 
    showToast("mycursor.getString(1) " + mycursor.getString(1) +" "); 
+4

Je sais qu'il est dans la documentation - [ListView] (http: //developer.android.com/reference/android/app/ListFragment.html) - mais je ne comprends pas pourquoi nous devrions utiliser 'getListView()' quand le ListView pertinent est déjà fourni en tant que paramètre. – losttime

+0

En effet. Et cela semble fonctionner correctement si je remplace 'getListView()' par 'l'. –

4
public void onItemClick(AdapterView<?> parent, View view,int position, long id) 
{ 
Map<String, Object> map = (Map<String, Object>)_productListView.getItemAtPosition(position); 
String _productCode = (String) map.get("ProductCode"); 
String _productName = (String) map.get("ProjectName"); 
Double _price = (Double) map.get("Price"); 
} 
0

J'ai utilisé le code suivant comme mentionné par Miki Habryn

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    Cursor client = (Cursor)parent.getItemAtPosition(position); 
    String client_name = client.getString(2); // third column in db 
    Toast.makeText(getBaseContext(), client_name, Toast.LENGTH_SHORT).show(); 
}