【问题标题】:RecyclerView onBindViewHolder called multiple times for one itemRecyclerView onBindViewHolder 为一项调用多次
【发布时间】:2018-01-26 21:48:49
【问题描述】:

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

我没有在我的代码中搜索特定的错误帮助。

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

是否有可能在不通知数据卫星已更改的情况下再次调用此方法?

我有点困惑。

亲切的问候, 手掌

【问题讨论】:

  • 同一个项目是什么意思?如果该项目是 ViewHolder,那么是的,这就是回收器的工作方式。如果您的意思是数据集中的一个条目,那么这似乎不对。
  • @Sam “项目”是指一个 ViewHolder。所以你说,这是RecyclerView的正常行为。我不明白这一点,如果 viewHolder 已经为这个项目创建了而没有更改数据集,为什么会再次调用它?

标签: android listview android-recyclerview android-viewholder


【解决方案1】:

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

RecyclerView 仅创建填充屏幕所需的最少数量的Views。它通过重用旧的/创建的Views 来工作。这样,当您向下滚动时,在滚动到顶部期间隐藏的 View 将被移除并放在最后一个可见的 View 旁边并添加到那里。但由于View 当前绑定了旧数据,因此再次调用onBindViewHolder() 以确保View 在渲染之前只绑定正确的数据。

同样,您会注意到 onCreateViewHolder() 仅被称为它所需的 Views 的确切最小数量。

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

【讨论】:

    猜你喜欢
    • 2017-03-05
    • 2016-07-02
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 2020-03-28
    • 2021-08-07
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多