Android - StableIDs的含义是什么?

gal*_*van 41 android listview

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

Del*_*yan 58

稳定的ID允许ListView优化notifyDataSetChanged调用之间项目保持不变的情况.它引用的ID是从中返回的ID getItemId.

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

  • **例如,如果ID只是数据中的索引,则必须重新创建所有内容**这不应该与事实相反吗?我的意思是,如果id只是索引而不是它始终稳定,因为它永远不会改变.索引n处的元素将始终返回n的id,因此永远不会更改.我的逻辑得到了@DanyloVolokh给出的解释的支持 (4认同)
  • 就是这种情况,您使用hasStableIds和从getItemId返回的数组索引,是的。我承认,措辞不是很好。编辑欢迎:) (2认同)

Dan*_*okh 21

如果hasStableIds()返回false,那么每次调用notifyDataSetChanged()适配器时都会查看返回的值,getItemId并且最终getView(int position, View convertView, ViewGroup parent)只调用id已更改的thous项.

使用此技术,您可以轻松更新ListView中的一个项目

如果你getItemId正确实现,那么它可能非常有用.

示例:

你有一个专辑列表:

class Album{
     String coverUrl;
     String title;
}
Run Code Online (Sandbox Code Playgroud)

你实现getItemId这样:

@Override
public long getItemId(int position){
    Album album = mListOfAlbums.get(position);
    return (album.coverUrl + album.title).hashCode();
}
Run Code Online (Sandbox Code Playgroud)

现在你的item id取决于coverUrltitle字段的值,如果你更改它们并调用notifyDataSetChanged()你的适配器,那么适配器将调用每个元素的getItemId()方法并仅更新id已更改的项.

如果您正在进行一些"重"操作,这非常有用getView().

  • ** - 1.这个答案是完全错误的.**当物品具有稳定的ID且你调用setHasStableIds(**true**)时,RecyclerView只能以这种方式避免不必要的工作.示例代码不会像编写者在任何情况下所说的那样工作.hasStableIds()询问关于项目**身份**的问题,而不是关于项目**值**的问题.如果hasStableIds()返回false,则适配器必须在每次更新时重新创建所有视图,因为它不能假定具有相同ID的列表项对应于相同的数据. (10认同)
  • 我想,你的意思是"如果hasStableIds()返回**true**",对吧? (3认同)
  • 不,我的意思是“假”。当 id 不稳定时。(可变) (2认同)
  • 除了@ClementCherlin 的评论之外, hashCode 方法用作标识符也不可靠。请记住,散列并不能保证唯一性,而是无法保证 *** 发现 *** 冲突。冲突在散列函数中非常常见,对于大型数据集,它们可能导致提供的数据和显示的数据不一致。 (2认同)