getItemAtPosition () Как получить читаемые данные из выбранного элемента в ListView - PullRequest
6 голосов
/ 08 октября 2010

У меня есть просмотр списка контактов, который я получил из образца Android ContactManager.Этот список отображается нормально, но я не могу понять, как получить информацию о выбранном элементе, например, «имя» и «номер телефона».

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

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

Вот мой код.

@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 ]

15 голосов
/ 21 января 2012
@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) +"   ");
6 голосов
/ 08 октября 2010

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

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

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

@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 голосов
/ 12 января 2015
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");
}
4 голосов
/ 30 января 2011

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

0 голосов
/ 16 июня 2016

Я использовал следующий код, упомянутый Мики Хабрином

    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();
}
...