RecyclerView的onBindViewHolder方法为何会对一个item多次调用?

13

我已经使用RececlerViewViewHolder模式一段时间了。 我正在实现自定义的Adapter

我不是在寻找代码中特定的错误帮助。

我只是想知道,在滚动到列表末尾并向上滚动时,onBindViewHolder方法被调用多次(针对同一项)是否正常。 在这种情况下,onBindViewHolder再次为项0和1调用(列表总共包含7个项)

有没有可能在不通知数据集更改的情况下再次调用此方法?

我有点困惑了。

此致 敬礼,Palm


你说的“同一项(the same item)”是什么意思? 如果指的是 ViewHolder,则是的,这是 Recycler 工作的方式。如果你指的是数据集中的一个条目(entry),那似乎不对。 - Sam
@Sam 通过“item”,我指的是一个ViewHolder。 所以你说,这是RecyclerView的正常行为。 我不明白,如果ViewHolder已经为此项创建且数据集没有更改,为什么它会再次被调用? - Palm
1个回答

19

一个 RecyclerView 调用多次 onBindViewHolder() 是完全正常的。

RecyclerView 只创建填充屏幕所需的最小数量的 Views。它通过重用旧/已创建的 Views 来工作。因此,当您向下滚动时,隐藏在滚动到顶部期间的视图将被移除并放置在最后可见 View 旁边,然后添加在那里。但是由于 View 目前绑定了旧数据,因此会再次调用 onBindViewHolder(),以确保该 View 绑定的仅是正确的数据,然后才呈现。

同样,您会注意到 onCreateViewHolder() 只调用所需的精确最小数量的 Views

为了更好地了解 RecyclerView 的工作原理,建议您阅读 Recycler、LayoutManager 和 Recycler.Adapter 这三个核心部分的相关信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接