我正在查看GridLayoutManager的文档及其RecyclerView的SpanSizeLookUp类。但我无法了解SpanSizeLookUp类的getSpanGroupIndex和getSpanIndex方法。我还通过覆盖和返回任意数字(小于跨度计数)进行实验。但我不知道它用于什么。
我无法理解文档说明。我想清楚这一点。
答案 0 :(得分:9)
默认情况下,网格布局中的每个项目占用1个跨度。如果Grid是水平的,span表示一行,如果Grid是垂直的,span表示一列。如果您的项目可能需要将自己布局为多个跨度(例如,3列网格中的标题项将具有spanSize = 3),则可以提供SpanSizeLookup,如果item是标题项,则返回3;如果是常规项,则返回1
当GridLayoutManager(GLM)需要决定项目的范围时,它会在SpanSizeLookup中调用getSpanIndex。该方法遍历给定位置之前的每个项目,以决定该项目应放置在哪个范围内。
例如,如果您调用glm.scrollToPosition(n)
,则SpanSizeLookup将遍历从0到N的每个项目,检查每个项目的消耗量,并确定N
处的项目所在的位置。假设您在索引0和3处有一个带有标题行的网格,其余项目需要1个跨度。如果GLM致电spanSizeLookup.getSpanIndex(4)
,它会为getSpanIndex
调用0 1 2 3
,请注意在第3项之后,下一项应放在第0位并返回。
虽然它会缓存这些结果,但如果您可以更快地计算它,则遍历所有项目效率很低。例如,您可能知道所有项目都需要1个跨度,然后您可以覆盖getSpanIndex
并返回n % spanCount
。这就是为什么这种方法是公开的。
getSpanGroupIndex
是该项目的组。如果GLM是垂直的,则组是" row"如果GLM是水平的,则组是"列"。它主要用于可访问性。对于上面每个项目消耗1个跨度的示例,您可以覆盖此方法并返回n / spanCount
。我同意这种方法不明确,会创建一张改进文档的票据。