了解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能够根据您的适配器计算出整个列表的确切高度和宽度,从而更好地进行优化。