了解 RecyclerView setHasFixedSize

新手上路,请多包涵

我在理解 setHasFixedSize() 时遇到了一些麻烦。我知道当 RecyclerView 的大小没有改变时,它用于优化,来自文档。

那是什么意思呢?在最常见的情况下, ListView 几乎总是具有固定大小。在什么情况下它不是固定大小?这是否意味着它在屏幕上占据的实际空间随着内容的增长而增长?

原文由 SIr Codealot 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

RecyclerView 的一个 非常 简化的版本有:

 void onItemsInsertedOrRemoved() {
   if (hasFixedSize) layoutChildren();
   else requestLayout();
}

此链接 描述了为什么调用 requestLayout 可能很昂贵。基本上,每当插入、移动或移除项目时,RecyclerView 的大小(宽度和高度)可能会发生变化,进而视图层次结构中任何其他视图的大小可能会发生变化。如果经常添加或删除项目,这尤其麻烦。

当更改适配器的内容不会更改其高度或宽度时,通过将 setHasFixedSize 设置为 true 来避免不必要的布局传递。


更新: JavaDoc 已更新以更好地描述该方法的实际作用。

如果 RecyclerView 可以提前知道 RecyclerView 的大小不受适配器内容的影响,则 RecyclerView 可以进行多种优化。 RecyclerView 仍然可以根据其他因素(例如其父级的大小)更改其大小,但此大小计算不能取决于其子级的大小或其适配器的内容(适配器中的项目数除外)。

如果您使用的 RecyclerView 属于此类,请将其设置为 {@code true}。它将允许 RecyclerView 在其适配器内容更改时避免使整个布局无效。

@param hasFixedSize 如果适配器更改不会影响 RecyclerView 的大小,则为 true。

原文由 LukaCiko 发布,翻译遵循 CC BY-SA 4.0 许可协议

setHasFixedSize() 指的是itemView的大小,也可以说是视图的大小,所以跟list或者ArrayList没什么关系,如果你想在adapter的不同位置改变视图的高宽,那就放吧假的

原文由 Himanshu Yadav Anshu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题