GridLayoutManager 高度与设定不一致的坑

在使用GridLayoutManager时,遇到在特定设备上item高度与设定不符的问题。经过源码分析,发现是老版本GridLayoutManager的一个坑。高度测量时,child的高度spec在某些情况下会被减去inset和margin,导致高度变小。这个问题在后续版本中已修复,但对老版本需要通过设置wrap_content或使用内容内margin/padding来兼容。
摘要由CSDN通过智能技术生成

最近在使用GridLayoutManager的时候,效果什么的都是好好的,突然在一台设备上发现item高度和设定值不一样。找了好久的原因发现是老版本GridLayoutManager的坑。特作此篇做个记录,并简单分析GridLayoutManager的源码。

GridLayoutManager继承自LinearLayoutManager,LinearLayoutManager初始化的时候默认方向是垂直的。GridLayoutManager测量child的主要重写layoutChunk方法。因此,我们重点分析一下layoutChunk方法。

while (count < mSpanCount && layoutState.hasMore(state) && remainingSpan > 0) {
            int pos = layoutState.mCurrentPosition;
            final int spanSize = getSpanSize(recycler, state, pos);
            if (spanSize > mSpanCount) {
                throw new IllegalArgumentException("Item at position " + pos + " requires " +
                        spanSize + " spans but GridLayoutManager has only " + mSpanCount
                        + " spans.");
            }
            remainingSpan -= spanSize;
            if (remainingSpan < 0) {
                break; // item did not fit into this row or column
            }
            View view = layoutState.next(recycler);
            if (view == null) {
                break;
            }
            consumedSpanCount += spanSize;
            mSet[count] = view;
            count++;
        }

这个方法是来处理GridLayoutManager跨列问题的,GridLayoutManager给我们提供了SpanSizeLookup这个类来实现item占用spanSize的问题。比如设置mSpanCount等于4,mSpanSizeLookup.getSpanSize(adapterPosition); 来获取adapterPosition占用的列数。当占用的列数累加超过mSpanCount就跳出,并把当行的View存储到mSet[]中。

// we should assign spans before item decor offse
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值