了解RecyclerView setHasFixedSize

我有一些麻烦了解setHasFixedSize() 。 我知道,当RecyclerView的大小没有改变时,它被用于优化,从文档。

这是什么意思? 在大多数情况下, ListView几乎总是有固定的大小。 在什么情况下,它不会是一个固定的大小? 这是否意味着它在屏幕上占有的实际房地产会随着内容而增长?

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

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

这个链接描述了为什么调用requestLayout可能是昂贵的。 基本上,无论何时插入,移动或移除项目,RecyclerView的大小(宽度和高度)都可能改变,并且视图层次结构中任何其他视图的大小都可能改变。 如果项目经常被添加或移除,这特别麻烦。

在添加或删除RecyclerView中的项目时,通过将setHasFixedSize设置为true,避免不必要的布局过程,并且不会更改其高度或宽度。

可以确认setHasFixedSize涉及RecyclerView本身,而不是每个项目的大小适应它。

您现在可以在RecyclerView上使用android:layout_height="wrap_content" ,除此之外,当RecyclerView为空时,允许CollapsingToolbarLayout知道它不应该折叠。 这只适用于在RecylcerView上使用setHasFixedSize(false)的情况。

如果在RecyclerView上使用setHasFixedSize(true) ,那么即使RecyclerView确实是空的,这种防止CollapsingToolbarLayout崩溃的行为也不起作用。

如果setHasFixedSize与项目的大小有关,那么当RecyclerView没有项目时,它应该没有任何影响。

ListView有一个类似的命名函数,我认为它反映了有关单个列表项高度的信息。 RecyclerView的文档很清楚地表明它指的是RecyclerView本身的大小,而不是其大小。

从上面的setHasFixedSize()方法的RecyclerView源注释:

  * RecyclerView can perform several optimizations if it can know in advance that changes in * adapter content cannot change the size of the RecyclerView itself. * If your use of RecyclerView falls into this category, set this to true. 

setHasFixedSize(true)表示RecyclerView具有固定宽度和高度的子项(项目)。 这使RecyclerView能够根据您的适配器计算出整个列表的确切高度和宽度,从而更好地进行优化。