Я реализую ListAdapter ExpandableListView, во время работы вижу, что мне нужно переопределить функцию boolean hasStableIds(). Может ли кто-нибудь объяснить, каково значение стабильных идентификаторов? когда мне это нужно?
Android - в чем смысл StableID?
Ответ 1
Стабильные идентификаторы позволяют оптимизировать ListView
для случая, когда элементы остаются неизменными между вызовами notifyDataSetChanged
. Идентификаторами, на которые он ссылается, являются те, которые возвращаются из getItemId
.
Без него ListView
должен воссоздать все View
, поскольку он не может знать, совпадают ли идентификаторы элементов между изменениями данных (например, если идентификатор является только индексом в данных, он должен воссоздать все). С его помощью он может воздержаться от воссоздания View
, который сохранил свои идентификаторы элементов.
Ответ 2
Если hasStableIds()
возвращает false, то каждый раз, когда вы вызываете notifyDataSetChanged()
, ваш адаптер будет искать возвращаемое значение getItemId
и в конечном итоге вызовет getView(int position, View convertView, ViewGroup parent)
только для тысяч элементов, которые изменили идентификатор.
Используя этот метод, вы можете легко обновить только один элемент в ListView
Если вы правильно выполняете getItemId
, это может быть очень полезно.
Пример:
У вас есть список альбомов:
class Album{
String coverUrl;
String title;
}
И вы реализуете getItemId
следующим образом:
@Override
public long getItemId(int position){
Album album = mListOfAlbums.get(position);
return (album.coverUrl + album.title).hashCode();
}
Теперь ваш идентификатор элемента зависит от значений полей coverUrl и title, и если вы измените их и вызовите notifyDataSetChanged()
на свой адаптер, тогда адаптер вызовет getItemId() для каждого элемента и обновить только те элементы, которые изменили идентификатор.
Это очень полезно, если вы выполняете "тяжелые" операции в getView()
.