#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
, «принадлежит» представлению списка и его адаптеру.