我正在实现ExpandableListView的ListAdapter,工作时发现需要重写函数boolean hasStableIds()。 请问有人能解释一下稳定id的含义吗?什么情况下需要使用它?
稳定的ID允许ListView
在notifyDataSetChanged
调用之间项目保持不变的情况下进行优化。它所指的ID是从getItemId
返回的那些ID。
如果没有稳定的ID,ListView
就必须重新创建所有的View
,因为它无法知道数据变更时是否保留了项目ID(例如,如果ID只是数据中的索引,则必须重新创建所有内容)。有了它,它可以避免重新创建保持其项目ID的View
s。
hasStableIds()
返回false
,则每次调用notifyDataSetChanged()
时,您的适配器将查看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和title字段的值,如果您更改它们并在适配器上调用notifyDataSetChanged()
,则适配器将调用每个元素的getItemId()方法,并且仅更新ID已更改的那些项目。
如果您在getView()
中执行一些“繁重”的操作,则此功能非常有用。
id
保证引用一个特定的唯一对象时,它应该返回true
,这意味着id
的变化表示对象已经改变,而id
保持不变则意味着它不是某个新对象返回相同的id
,在这种情况下,视图必须更新并且需要返回false
。 - KaruhangaRecycledViewPool
中并应该被回收利用。对我来说,稳定的 ID 的优点是你不需要再次绑定它们。或者我错过了什么吗? - mbonnin