GridLayoutManager 如何实现一会一行一会二行呢

2019-07-18  本文已影响0人  一个冬季
参考文章

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);
       .....省略代码
    }

上一篇 下一篇

猜你喜欢

热点阅读