我们何时使用recyclerView.setHasFixedSize?

37

事情是这样的: 有人知道setHasFixedSize方法吗?有些人说,如果所有的项都是相同大小的,它可以进行优化。在来自android.support.v7.widget的RecyclerView类中,它被注释为:如果RecyclerView事先知道适配器内容的更改不会改变RecyclerView本身的大小,则RecyclerView可以执行几个优化操作。如果您使用RecyclerView属于此类别,请将其设置为true。

这意味着什么?有人可以向我展示如何使用它的上下文或解释上面“此类别”的含义吗? 非常感谢。


文档中有详细说明。如果RecyclerView能够预先知道适配器内容的更改不会改变RecyclerView本身的大小,则可以执行几种优化。如果您使用RecyclerView属于此类别,请将其设置为true。 - Pedro Oliveira
3
抱歉,我真的不理解以下这些词语的含义:“更改”适配器内容不能更改RecyclerView本身的“大小”。如果您使用RecyclerView属于此类别,请将其设置为true。是什么样的更改,它是指其大小吗?如果是这样,那么“大小”是什么意思? - machinezhou
3
大多数情况下,它们是“match_parent”。因此,RView的高度将是屏幕高度,我应该将setHasFixedSize设置为true,这是“类别”吗? - machinezhou
1
是的,理解这个并不难。 - Pedro Oliveira
1
好的,还有一个问题,请问,“match_parent”会因为recyclerview中的项目重用和预加载机制而通过,但如果高度是“wrap_content”或者项目数量小于屏幕高度怎么办?我刚刚跟随源代码到达了recyclerview类,但仍然无法理解这个“fixedsize”方法的优化基本思想。 - machinezhou
显示剩余2条评论
2个回答

33

RecyclerView希望知道它的大小(宽度和高度)是否取决于适配器内容,以避免昂贵的布局操作。如果RecyclerView事先知道其大小不取决于适配器内容,则每次向适配器添加或删除项目时,它将跳过检查其大小是否应更改。这尤其重要,因为插入和删除元素可以经常发生。

如果RecyclerView的大小(指RecyclerView本身)不取决于适配器内容:

mRecyclerView.setHasFixedSize(true);

...取决于适配器的内容:

mRecyclerView.setHasFixedSize(false);
如果您查看RecyclerView类,您将会更详细地了解它,因为现在这个类中并不多处使用mHasFixedSize。将其设置为true并不意味着RecyclerView的大小是固定的,只是意味着它不会因为适配器内容的改变而改变。例如,RecyclerView的大小可能会因为其父级大小的改变而改变。

7
术语“size”有三种含义:框架大小(即滚动视图的大小),布局大小(即可滚动区域的大小)或项目数量。为了明确无误,此方法指的是第一种,通常为“match_parent”。 - Maarten
1
正如@Maarten所说,如果我们的RecyclerView高度设置为match_parent,我们应该添加setHasFixedSize(true),因为RecyclerView本身的大小不会随着插入或删除项目而改变。如果我们的RecyclerView高度设置为wrap_content,则应该将其设置为false,因为适配器插入的每个元素都可能会改变Recycler的大小,因此每次添加/删除项目时,Recycler的大小都会不同。 - Gastón Saillén
如果将“layout_height”设置为“0dp”以填充可用空间,会怎样呢?它不会随着内容的添加/删除而改变大小,但在每个屏幕上大小并不相同。 - grolschie
1
Gastón Saillén:我有一个使用情况,其中我将高度设置为match-parent,如果我设置setHasFixedSize(true),则内容不会显示,但如果设置setHasFixedSize(false),则项目将显示。我已经测试了高度为wrap_content和match_parent。那没有任何区别。那只决定了视图的高度,而不是所有三个方面-->项目数量、框架大小、布局区域..也许。 - Dinesh
如果我们有一个可扩展的RecyclerView,高度为“match_parent”,但是项目布局具有其高度,即高度为“wrap_content”,导致项目的高度大小不同,那么这个集合应该是什么? - Reyhane Farshbaf

3

setHasFixedSize()方法用于让RecyclerView保持相同的大小

这个信息将被用来优化自身。

参考链接如下:

http://antonioleiva.com/recyclerview/

示例:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);
recyclerView.setHasFixedSize(true);

如果数据来自服务器且其大小通常是不确定的,在这种情况下,我们最好不要将该方法设置为true,我说得对吗? - machinezhou
这让我得出结论:如果有20个图标,我想把它们放入RecyclerView中,那么这是最好的“类别”设置,将该方法设置为true。请纠正我。 - machinezhou
3
我认为这个解释是误导性的。只要RecyclerView不会因其内容而改变大小,就可以使用方法setHasFixedSize(true)。 - Ευάγγελος Μπίλης

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接