Android - в чем смысл StableID?

Я реализую ListAdapter ExpandableListView, во время работы вижу, что мне нужно переопределить функцию boolean hasStableIds(). Может ли кто-нибудь объяснить, каково значение стабильных идентификаторов? когда мне это нужно?

Ответ 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().