本文已参与「新人创作礼」活动,一起开启掘金创作之路。
进行数据显示时,有时需求要网格式布局显示列表,Paging3的的网格布局并不复杂,只需要将recycleView的layoutManager设置为GridLayoutManager即可。
但是如果按照往常footer的用法,那loadFooter的显示效果会不是很理想,效果如下
很明显最后这个footer的布局是被局限在了一个跟其他item一样的空间里,看起来很不美丽,我们想要的效果是这个footer能独自在最后一行占一排,这样会美丽很多。
先上答案
val adapter = PostsAdapter(glide)
val loadStateFooterAdapter = LoadStateFooterAdapter(this)
val adapterWrapper = adapter.withLoadStateFooter(loadStateFooterAdapter)
list.adapter = adapterWrapper
list.layoutManager = GridLayoutManager(this, 5).apply {
spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
//此处用于判断的值需要具体情况具体分析,详细看下面解析
return if (adapterWrapper.getItemViewType(position) == 1) {
spanCount
} else 1
}
}
}
效果展示:
方案解析
思路:找到footer这个item然后将他所占的格子设置为顶满即可完成我们的目标
1、改变span数目可以通过设置GridLayoutManager中spanSizeLookup的getSpanSize()方法
2、寻找footer这个item可以使用ConcatAdapter.getItemViewType(int position)获取到type,经过对比后可确认哪个是footer。
第二点中的type是Int值,这个type的来源逻辑如下:
每个不同ViewType的ViewHolder对应的itemView(一个Adapter中可能有多个ViewType),会分配一个Int类型的globalType,分配的值取决于此类型的itemView第一次调用getItemViewType的顺序,并且在分配完毕之后不会再变,即如果存在ABC三种类型,若调用循序为BABBCAB,则ABC分别对应的值为A1B0C2。上述例子中是先布局的图片item然后是footer,所以footer对应的type是1.