我有点难以理解setHasFixedSize()。我知道它用于RecyclerView在 docs 的大小不变时进行优化。
setHasFixedSize()
RecyclerView
那是什么意思呢?在最常见的情况下,aListView几乎总是具有固定大小。在什么情况下它不是固定大小?这是否意味着它在屏幕上占据的实际空间随着内容的增长而增长?
ListView
RecyclerView的一个 非常 简化的版本有:
void onItemsInsertedOrRemoved() { if (hasFixedSize) layoutChildren(); else requestLayout(); }
此链接描述了为什么调用requestLayout可能很昂贵。基本上,每当插入、移动或移除项目时,RecyclerView 的大小(宽度和高度)可能会发生变化,进而视图层次结构中任何其他视图的大小可能会发生变化。如果经常添加或删除项目,这尤其麻烦。
requestLayout
setHasFixedSize当更改适配器的内容不会更改其高度或宽度时,通过设置为 true 来避免不必要的布局传递。
setHasFixedSize
更新: JavaDoc 已更新以更好地描述该方法的实际作用。
如果 RecyclerView 能够提前知道 RecyclerView 的大小不受适配器内容的影响,则 RecyclerView 可以进行多种优化。RecyclerView 仍然可以根据其他因素(例如其父级的大小)更改其大小,但此大小计算不能取决于其子级的大小或其适配器的内容(适配器中的项目数除外)。 如果您使用的 RecyclerView 属于此类,请将其设置为 {@code true}。它将允许 RecyclerView 在其适配器内容更改时避免使整个布局无效。 @param hasFixedSize 如果适配器更改不会影响 RecyclerView 的大小,则为 true。
如果 RecyclerView 能够提前知道 RecyclerView 的大小不受适配器内容的影响,则 RecyclerView 可以进行多种优化。RecyclerView 仍然可以根据其他因素(例如其父级的大小)更改其大小,但此大小计算不能取决于其子级的大小或其适配器的内容(适配器中的项目数除外)。
如果您使用的 RecyclerView 属于此类,请将其设置为 {@code true}。它将允许 RecyclerView 在其适配器内容更改时避免使整个布局无效。
@param hasFixedSize 如果适配器更改不会影响 RecyclerView 的大小,则为 true。