50

我正在实现 ExpandableListView 的 ListAdapter,在工作时我发现我需要覆盖函数 boolean hasStableIds()。谁能解释一下稳定ID的含义是什么?我什么时候需要这个?

4

2 回答 2

66

稳定的 ID 允许针对调用ListView之间的项目保持不变的情况进行优化。notifyDataSetChanged它引用的 ID 是从getItemId.

如果没有它,则ListView必须重新创建所有Views,因为它无法知道项目 ID 在数据更改之间是否相同(例如,如果 ID 只是数据中的索引,则必须重新创建所有内容)。有了它,它可以避免重新创建View保留其项目 ID 的 s。

于 2013-08-13T19:29:27.990 回答
22

如果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().

于 2015-04-04T13:22:17.673 回答