参考文章
Recyclerview根据setSpanSizeLookup实现复杂布局(不用嵌套)
需求
需求.png说明
这个博客只会展示部分关键代码
学习到的知识点
1、gridLayoutManager.setSpanSizeLookup返回的是每个Item的跨度,我们不能简单的认为在setSpanSizeLookup方法里,我们直接return 2,表示整个Item跨度为2列
//我们期望的是创建6列
GridLayoutManager mLayoutManager = new GridLayoutManager(this, 6);
recyclerView.setLayoutManager(mLayoutManager);
//adapter
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if (manager instanceof GridLayoutManager){
GridLayoutManager gridLayoutManager = (GridLayoutManager) manager;
//每个item占用的跨度数
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
//在这里,我们需要将上面写的6作为一个分母,我们在getSpanSize返回的数据是分子
//所以如果我们希望每个Item占据的是2列,那么这里return 3
int type = getItemViewType(position);
if (type == SETMEAL_TYPE_0){
return gridLayoutManager.getSpanCount();//返回为6
}else {
return 3;
}
}
});
}
}
效果分析&代码实现
我们可以将这个效果图拆分成2部分,一部分是VIP,VVIP等这种标题,一部分是样式都相同的长矩形,然后矩形之间都是有空隙的。所以这里我们需要重新复写getItemViewType,然后动态的设置margin
@Override
public int getItemViewType(int position) {
if (list.get(position).getType() == SETMEAL_TYPE_0){
return SETMEAL_TYPE_0;//标题
}else {
return SETMEAL_TYPE_1;//一般的item
}
}
* @date: 2019/7/18 0018
* @author: gaoxiaoxiong
* @description:每个长方形Item
**/
public void ToProductViewHoder(ProductViewHoder hoder,GetGoodsLevel model){
GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) hoder.itemView.getLayoutParams();
params.setMargins(model.getMarginLeft(), 0,model.getMarginRight(), 0);
.....省略代码
}
/**
* @date: 2019/7/18 0018
* @author: gaoxiaoxiong
* @description:头部处理的标题
**/
public void ToHeaderViewHolder(HeaderViewHolder holder,GetGoodsLevel model){
GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();
params.setMargins(0, 0, 0, 0);
.....省略代码
}
网友评论