Практическая разница между позицией и идентификатором строки в onListItemClick()

Я запутался в разнице между postion а также row id в ListActivity.onListItemClick(),

Документация имеет следующее:

position  The position of the view in the list
id        The row id of the item that was clicked

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

2 ответа

Решение

position: позиция представления в списке
id: идентификатор строки элемента, который был нажат

Позиция начинается с 0, сверху вниз в ListView, тогда как для получения правильного идентификатора строки важно, чтобы курсор, который был передан адаптеру, содержал столбец с именем _id, представляющий уникальный идентификатор для каждой строки в таблице.,

Если вы используете ArrayAdapter, position а также id стать таким же. Идентификатор будет возвращаемым значением Adapter.getItemId(int) так что если вы используете ArrayAdapter, он будет таким же, как позиция - быстрый поиск ArrayAdapter исходный код показывает, что он использует позицию возврата; разработать идентификатор.

Ответ от Lazy Ninja в основном правильный, однако не учитывает случай использования ArrayAdapter с добавлением представления заголовка путем вызова ListView.addHeaderView(View) метод.

Если в вашем списке есть элемент заголовка, он будет в позиции 0.

Итак, первый "настоящий" элемент в списке будет иметь:

  • position = 1
  • id = 0

В общем, position знак равно id + number_of_header_views


Это важно понимать, если вы решили добавить представление заголовка к списку в коде, который уже работает правильно.

Если вы получаете доступ к своим товарам, используя position, тогда ваш код должен быть обновлен следующим образом:

  • использование position - 1 в качестве индекса
  • использование id в качестве индекса
  • использование ListView.getItemAtPosition(int) вместо Adapter.getItem(int)

Также см. Этот вопрос для связанной дискуссии:

Другие вопросы по тегам