小编典典

了解 RecyclerView setHasFixedSize

all

我有点难以理解setHasFixedSize()。我知道它用于RecyclerView在 docs 的大小不变时进行优化。

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


阅读 67

收藏
2022-08-05

共1个答案

小编典典

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。

2022-08-05