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

#android #onlongclicklistener #android-adapterview

#Android #onlongclicklistener #android-adapterview

Вопрос:

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

Сигнатура метода и определение параметров в соответствии с документами 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
  

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

Ответ №1:

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

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

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

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

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

Ответ №2:

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

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

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