4

我正在查看 GridLayoutManager 及其 RecyclerView 的 SpanSizeLookUp 类的文档。但我无法了解 SpanSizeLookUp 类的 getSpanGroupIndex 和 getSpanIndex 方法。我还通过覆盖和返回任意数字(小于跨度计数)进行了实验。但我不知道它是做什么用的。

我无法理解文档说明。我想澄清这一点。

4

1 回答 1

10

默认情况下,网格布局中的每个项目占用 1 个跨度。如果 Grid 是水平的,span 表示一行,如果 Grid 是垂直的,span 表示一列。如果您的项目可能需要将自己布置成多个跨度(例如,3 列网格中的标题项目将具有 spanSize=3),您可以提供 SpanSizeLookup,如果项目是标题项目,则返回 3,如果是常规项目,则返回 1 .

当 GridLayoutManager (GLM) 需要决定一个项目的跨度时,它会调用 SpanSizeLookup 中的 getSpanIndex。该方法遍历给定位置之前的每个项目,以决定该项目应放置在哪个跨度上。

例如,如果您调用glm.scrollToPosition(n),SpanSizeLookup 会遍历从 0 到 N 的每个项目,检查每个项目消耗了多少跨度并决定项目的N位置。假设您在索引 0 和 3 处有一个带有标题行的网格,其余项目占用 1 个跨度。如果 GLM 调用spanSizeLookup.getSpanIndex(4)它会调用getSpanIndex0 1 2 3意识到在第 3 个项目之后,下一个项目应该放在跨度 0 并返回它。

虽然它缓存了这些结果,但如果你能更快地计算它,那么遍历所有项目是低效的。例如,也许您知道所有项目都占用 1 个跨度,那么您可以覆盖getSpanIndex并返回n % spanCount。这就是为什么该方法是公开的。

getSpanGroupIndex是项目的组。如果 GLM 是垂直的,组是“行”,如果 GLM 是水平的,组是“列”。它主要用于可访问性。对于上面每个项目消耗 1 个跨度的示例,您可以覆盖此方法并返回n / spanCount。我同意这种方法不明确,会创建一个改进文档的票。

于 2014-12-28T18:15:06.583 回答