Параметры прослушивателя кликов Android AdapterView — позиция и идентификатор

Я устанавливаю прослушиватель длинного щелчка в списке и хочу использовать индекс выбранного элемента для получения соответствующего объекта.

Подпись метода и определение параметра в соответствии с документами Android

public abstract boolean onItemLongClick (AdapterView<?> parent, View view, int position, long id)

Parameters
parent     The AbsListView where the click happened
view       The view within the AbsListView that was clicked
position   The position of the view in the list
id         The row id of the item that was clicked

Мой вопрос: будут ли «позиция» и «идентификатор» всегда одинаковыми? Эти определения кажутся взаимозаменяемыми, так в чем же разница?


person tpow    schedule 22.10.2011    source источник


Ответы (2)


Позиция и идентификатор могут быть одинаковыми, но на самом деле это зависит от используемого вами адаптера.

В основном 2 метода в адаптере определяют, каким будет идентификатор - в случае SimpleCursorAdapter (и быстрый взгляд на исходный код) это поле '_id' из запроса, который создал курсор, но методы в адаптере, которые определяют параметр id:

Adapter.getItemId(int), который позволяет адаптер для преобразования позиции в идентификатор объекта и Adapter.hasStableIds(), который позволяет ListView (или чему-либо, использующему адаптер для его кэширования) - хотя вы, вероятно, можете игнорировать hasStableIds().

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

Если вы используете пользовательский адаптер, то это полностью зависит от вас.

person zeetoobiker    schedule 22.10.2011

ID — это идентификатор из базы данных (т. е. _ID). position — это позиция в массиве или ArrayList.

Например: если у вас есть записи БД с идентификаторами 1,2,3,4, и вы используете SQL для извлечения записей (и заполнения массива или ArrayList), у вас может быть некоторый фильтр (предложение where) и показывать только элементы с идентификаторами 1 и 3. Таким образом, у вас есть только 2 возможных position - 0 и 1.

Разница в том, что вы можете думать об идентификаторе строки как о каком-то внешнем идентификаторе, который принадлежит самой строке данных. Напротив, position "принадлежит" представлению списка и его адаптеру.

person Ognyan    schedule 22.10.2011