一、前言
在使用RecyclerView多布局的时候,我们经常会遇到这样的界面,上面多个不固定位置的布局,下面是一个固定的2列瀑布流布局列表。有的小伙伴们估计把下面的瀑布流布局,单独用Recyclerview作为item,或者单独拧出来。前者大概率有事件冲突,而且数据也不好处理;后者失去了多布局的意义。我们有更简洁的方法,整个布局使用瀑布流布局,上面的多个布局,每个实现单独占一行
二、具体实现
这里介绍RecyclerView两种管理器实现独占一行的实现,表格布局实现(GridLayoutManager)和我们上面说的瀑布流布局(StaggeredGridLayoutManager),主要都是用布局管理器实现
- 表格布局(GridLayoutManager)
val gridLayoutManager = GridLayoutManager(this, 3)
gridLayoutManager.spanSizeLookup = object : SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return if (position == position % 3) {
3
} else {
1
}
}
}
上面是一个3列的表格布局,下标为3的倍数的item独占一行。注意:这里返回的3,意思是这个item占3列,1就是正常的占一列
-
瀑布流布局(StaggeredGridLayoutManager)
这里直接可以在adapter中的onViewAttachedToWindow下面实现,上面的表格布局也一样可在这里实现
override fun onViewAttachedToWindow(holder: ViewHolder) {
super.onViewAttachedToWindow(holder)
val type = holder.itemViewType
if (type == 1 || type == 2 || type == 3){
val lp = holder.itemView.layoutParams
if (lp is StaggeredGridLayoutManager.LayoutParams) {
lp.isFullSpan = true
}
}
}
上面代码表示多布局类型为1、2、3的item独占一行,主要设置lp.isFullSpan = true
网友评论