美文网首页
GridLayoutManager 如何实现一会一行一会二行呢

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

作者: 一个冬季 | 来源:发表于2019-07-18 14:29 被阅读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);
           .....省略代码
        }
    
    

    相关文章

      网友评论

          本文标题:GridLayoutManager 如何实现一会一行一会二行呢

          本文链接:https://www.haomeiwen.com/subject/asfllctx.html