Практическая разница между позицией и идентификатором строки в 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
= 1id
= 0
В общем, position
знак равно id
+ number_of_header_views
Это важно понимать, если вы решили добавить представление заголовка к списку в коде, который уже работает правильно.
Если вы получаете доступ к своим товарам, используя position
, тогда ваш код должен быть обновлен следующим образом:
- использование
position - 1
в качестве индекса - использование
id
в качестве индекса - использование
ListView.getItemAtPosition(int)
вместоAdapter.getItem(int)
Также см. Этот вопрос для связанной дискуссии: