2010-10-07 2 views
5

У меня есть список контактов, которые я получил из образца ContactManager Android. Этот список отображается хорошо, но я не могу понять, как получить информацию из выбранного элемента, например «имя» и «номер телефона».getItemAtPosition() Как получить читаемые данные из выбранного элемента в ListView

Я могу получить выбранную позицию, но результат mContactList.getItemAtPosition (position) - это ContentResolver $ CursorWrapperInner, и это на самом деле не имеет для меня никакого смысла. Я не могу получить от этого головы или хвосты.

Кто-нибудь знает, как я могу получить имя/идентификатор/номер телефона из выбранного элемента в спискеView?

Вот мой код.

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

} `

ответ

5

БУМ! Я понял это. В основном вы получаете номер позиции из события click, а затем в моем addContatAt() вы используете эту позицию для поиска в курсоре для нужного поля. В моем случае я хотел отображать имя.

Я привык делать вещи в Flex, так что это Cursor бизнес отличается для меня :)

В любом случае, для других здесь мой код:

@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

Хм - вы Мессинг с вашим курсором AdapterView за его спиной, что не всегда может быть хорошей идеей. Альтернативой является вызов parent.getItemAtPosition (position) внутри вашего обработчика onItemClick и передача результата в Cursor; он будет указывать на строку, соответствующую элементу, на который был нажат.

+0

Это возвратит точно так же 'Cursor' объект – 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

Я знаю, что в документации - [ListView] (HTTP: //developer.android.com/reference/android/app/ListFragment.html) - но я не могу понять, почему мы должны использовать 'getListView()', когда соответствующий ListView уже представлен как параметр. – losttime

+0

Действительно. И мне кажется, что это отлично работает, если я заменил 'getListView()' на '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

Я использовал следующий код, как упоминалось Мики 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(); 
} 
Смежные вопросы