Мне любопытно о цели методов getItem
иgetItemId
класса Adapter в Android SDK.
Из описания, похоже, getItem
следует возвращать исходные данные. Итак, если у меня есть массив имен, ["cat","dog","red"]
и я создаю адаптер, a
используя это, то a.getItem(1)
должен вернуть «собаку», правильно? Что должно a.getItemId(1)
вернуться?
Если вы использовали эти методы на практике, не могли бы вы привести пример?
getItemId()
вArrayAdapter()
всегда возвращается-1
сassert false : "TODO"; return -1;
Ответы:
Я вижу эти методы как более чистый подход к доступу к данным моего списка. Вместо прямого доступа к моему объекту адаптера через что-то вроде этого
myListData.get(position)
я могу просто вызвать адаптер какadapter.get(position)
.То же самое касается
getItemId
. Обычно я использую этот метод, когда хочу выполнить какую-то задачу на основе уникального идентификатора объекта в списке. Это особенно полезно при работе с базой данных. Возвращенныйid
может быть ссылка на объект в базе данных, с которым я затем мог бы выполнять различные операции (обновление / удаление / и т. Д.).Таким образом, вместо доступа к идентификатору из необработанного объекта данных, который
myListData.get(position).getId()
вы можете использоватьadapter.getItemId(position)
.Одним из примеров того, где я чувствовал, что мне нужно было использовать эти методы, был проект, использующий SeparatedListViewAdapter . Этот адаптер может содержать несколько различных типов адаптеров, каждый из которых представляет данные различного типа (обычно). При звонке
getItem(position)
наSeparatedListViewAdapter
объект возвращается , может отличаться в зависимости от «раздела» позиция в том , что вы посылаете его.Например, если у вас 2 разделов в списке (фруктов и конфеты): Если вы использовали
getItem(position)
иposition
оказались на элементе в фруктовом разделе, вы получите другой объект , чем если бы вы запросилиgetItem(position)
сposition
указывающим на элемент в карамели раздел. Затем вы можете вернуть какое-то постоянное значение идентификатора, вgetItemId(position)
котором отображается типgetItem(position)
возвращаемых данных , или использоватьinstanceof
для определения того, какой объект у вас есть.Кроме того, что я упомянул, я никогда не чувствовал, что мне действительно нужно использовать эти методы
источник
getView
,getCount
,getViewTypeCount
И т.д. используются специально для правильно показывая свой ListView UI. другие функции просто помогают создавать и реализовывать другие функции, такие как выполнение дальнейших действий при нажатии на элемент и т. д., хотя я часто использую ихgetItem
внутриgetView
getItemId
, просто возвращать0L
илиnull
и нигде не использовать. Я не вижу очевидной причины, по которой UUID был бы более ценным, чем просто какое-тоlong
значение для ID. Отключен режим? Что это такое?Что ж, похоже, на этот вопрос можно было бы ответить проще и проще ... :-)
Проще говоря, Android позволяет прикрепить
long
к любомуListView
элементу, это так просто. Когда система уведомляет вас о выборе пользователя, вы получаете три идентифицирующие переменные, чтобы сказать вам, что было выбрано:long
вы прикрепили к отдельным элементам.Вы сами решаете, какой из этих трех вариантов проще всего решать в вашем конкретном случае, но у вас есть все три варианта на выбор. Думай об этом
long
как о теге, автоматически прикрепленном к элементу, только в том случае, если он еще проще и легче считывается.Непонимание того, что обычно происходит, основано на простом соглашении. Все адаптеры должны предоставить
getItemId()
даже если они на самом деле не используют эту третью идентификацию. Таким образом, по соглашению, эти адаптеры (включая множество в примерах в SDK или по всему Интернету) просто возвращаютсяposition
по одной причине: они всегда уникальны. Тем не менее, если адаптер возвращаетсяposition
, это действительно означает, что он вообще не хочет использовать эту функцию, так какposition
как в любом случае он уже известен.Итак, если вам нужно вернуть любое другое значение, которое вы считаете нужным, не стесняйтесь сделать это:
источник
getItemId()
... Что произойдет, если / если этот метод не переопределен в вашем пользовательском адаптере?Этот
getItemId
метод в основном предназначен для работы с курсорами, поддерживаемыми базами данных SQLite. Он вернет поле id основного курсора для элемента в позиции 1.В вашем случае нет идентификатора для элемента в позиции 1: я предполагаю, что реализация ArrayAdapter просто возвращает -1 или 0.
РЕДАКТИРОВАТЬ: на самом деле, он просто возвращает позицию: в этом случае
1
.источник
-1
. Вот реализацияassert false : "TODO"; return -1;
Я хотел бы отметить , что после внедрения
getItem
иgetItemId
вы можете использовать ListView.getItemAtPosition и ListView.getItemIdAtPosition для прямого доступа к вам данных, вместо того , чтобы идти через адаптер. Это может быть особенно полезно при реализации слушателя onClick.источник
Если вы реализуете
getItemId
правильно, то это может быть очень полезно.Пример :
У вас есть список альбомов:
И вы реализуете
getItemId
так:Теперь ваш идентификатор элемента зависит от значений полей coverUrl и title, и если вы измените его и
notifyDataSetChanged()
вызовете свой адаптер, то адаптер вызовет метод getItemId () каждого элемента и обновит только те элементы, идентификатор которых изменился.Это очень полезно, если вы выполняете некоторые «тяжелые» операции в вашем
getView()
.Кстати: если вы хотите, чтобы это работало, вы должны убедиться, что ваш
hasStableIds()
метод возвращает false;источник
hasStableIds()
возвращать false? Мне кажется, что хеш-код, вычисленный из одной и той же строки, будет возвращать одно и то же значение каждый раз, что является стабильным идентификатором в соответствии с документами .getItem
илиgetItemId
несколько методов, предназначенных в основном для прикрепления данных с элементами в списке. В случаеgetItem
, вы можете передать любой объект, который будет прикреплен к элементу в списке. Обычно люди возвращаютсяnull
.getItemId
любое уникальноеlong
значение, которое вы можете прикрепить к тому же элементу в списке. Люди обычно возвращают позицию в списке.Какая польза. Ну, так как эти значения привязаны к элементу в списке, вы можете извлечь их, когда пользователь нажимает на элемент. Эти значения доступны через
AdapterView
методы.источник