android - RecyclerView重用算法

标签 android android-recyclerview

我有一个具有多种 View 类型的 Adapter。 我注意到 onCreateViewHolder() 经常被调用,即使 onCreateViewHolder()onBindViewHolder()getItemViewType() 正确实现。

例如,我的 RecyclerView 应该像这样显示一个简单的不同项目列表,并假设所有项目都具有相同的 View 高度并且 6 个元素填满整个屏幕(与 RecyclerView 的高度相匹配):

> ViewType0
> ViewType0
> ViewType0
> ViewType0
> ViewType0
> ViewType1
> ViewType2
> ViewType2
> ViewType2
> ViewType2
> ViewType1    
> ViewType1
> ViewType1
> ViewType0
> ViewType0
> ViewType0

当滚动并到达列表末尾时,似乎对于最后两项 (ViewType0) RecyclerView 调用 onCreateViewHolder() 但从我的角度来看,recyclerview应该回收(再利用)已经存在的(列表顶部有 5 个不可见)而不是为最后两个项目重新创建两个新的。

这种行为正常吗?我可以应用哪些设置来避免重新创建新的 ViewHolder,因为应该有绝对可重用的 ViewHolder(从列表顶部开始)?

最佳答案

这是完全正常的。我将简要解释它是如何工作的。

一旦任何 View 滚出窗口,RecyclerView 就有两个选择:回收或重用该 View 。它通过简单地将下一个出现的项目的 viewType 与 ScrollView 进行比较来确定要选择的选项;如果它们相同,只需重复使用 View ,反之亦然。

在您的情况下,这 5 个 ViewType0 View 肯定会在最后两个 ViewType0 View 设置为出现之前回收很长时间,因此显示 View 的唯一方法是重新创建它。

关于android - RecyclerView重用算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28879872/

相关文章:

android - 如何防止移动设备调整大小和使用正确的 css 文件

android - 单击其他 Activity 中的后退按钮时,Firebase Recyclerview(垂直滚动)始终滚动到开始

javascript - 如何在 Android 版 Chrome 中获取正确的纵向视频

java - AsyncTask - onPostExecute UI 混淆

android - 使用 RecyclerView 适配器更新数据的最佳方法

android - 在 Recyclerview 中错误地运行 onBindViewHolder - Kotlin

java - 使用 LiveData 从 Fragment 内部操作 RecyclerView 中的数据

java - 回收者认为适配器没有被调用

android - 如何取消 JobIntentService

android LinearLayout - ImageView 被推离屏幕