需求
当 RecyclerView 用于一行展示多个 item 时,会用到 GridLayoutManager .这时其他的 viewtype 可能仍然希望占据一整行,例如底部的加载更多view,如下图所示:
解决
- 继承 GridLayoutManager.SpanSizeLookup() 类,重写 getSpanSize 方法.返回此item期望占据的 SpanSize
val layoutManager = GridLayoutManager(this, SPAN_COUNT)
val spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
// 根据实际情况处理需要返回的值.
//例如我的代码中不同data类型对应不同的viewtype. 因此客户根据数据类型返回
val item = items[position]
return if (item is NoMoreData) SPAN_COUNT else 1
}
}
layoutManager.spanSizeLookup = spanSizeLookup
备注: getSpanSize(position: Int) 中的 position参数 是RecyclerView真正的位置控制. 即使是占据了多个 SpanSize ,本质上也是一个 position