我正在实现 ExpandableListView 的 ListAdapter,在工作时我发现我需要覆盖函数 boolean hasStableIds()。谁能解释一下稳定ID的含义是什么?我什么时候需要这个?
2 回答
稳定的 ID 允许针对调用ListView
之间的项目保持不变的情况进行优化。notifyDataSetChanged
它引用的 ID 是从getItemId
.
如果没有它,则ListView
必须重新创建所有View
s,因为它无法知道项目 ID 在数据更改之间是否相同(例如,如果 ID 只是数据中的索引,则必须重新创建所有内容)。有了它,它可以避免重新创建View
保留其项目 ID 的 s。
如果hasStableIds()
返回false
,那么每次调用notifyDataSetChanged()
Adapter 时都会查看 的返回值getItemId
并最终调用getView(int position, View convertView, ViewGroup parent)
. 如果hasStableIds()
返回true
,这只会在他们的 id 发生变化时完成。
使用这种技术,您可以轻松地只更新 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();
}
现在您的项目 id 取决于coverUrl和标题字段的值,如果您更改它们并调用notifyDataSetChanged()
您的适配器,那么适配器将调用每个元素的 getItemId() 方法并仅更新那些 id 已更改的项目。
如果在您的getView()
.