美文网首页
RecyclerView 分割线 bug 分析

RecyclerView 分割线 bug 分析

作者: cao苗子 | 来源:发表于2019-08-16 16:56 被阅读0次

1.先看效果问题图

image.png

看这张图片不能发现,最后一个Item的宽度会比前面两个的宽。原因是什么呢?
当分割线设置的很宽的时候 就会很明显这种现象。看下面的源码

2.源码分析

 public void measureChild(@NonNull View child, int widthUsed, int heightUsed) {
            final LayoutParams lp = (LayoutParams) child.getLayoutParams();

            final Rect insets = mRecyclerView.getItemDecorInsetsForChild(child);
            widthUsed += insets.left + insets.right;
            heightUsed += insets.top + insets.bottom;
            final int widthSpec = getChildMeasureSpec(getWidth(), getWidthMode(),
                    getPaddingLeft() + getPaddingRight() + widthUsed, lp.width,
                    canScrollHorizontally());
            final int heightSpec = getChildMeasureSpec(getHeight(), getHeightMode(),
                    getPaddingTop() + getPaddingBottom() + heightUsed, lp.height,
                    canScrollVertically());
            if (shouldMeasureChild(child, widthSpec, heightSpec, lp)) {
                child.measure(widthSpec, heightSpec);
            }
        }

这段代码就是 item 的测量代码。
final Rect insets = mRecyclerView.getItemDecorInsetsForChild(child);得到的是分割线大小
insets.left + insets.right =》得到的是分割线的占用宽度
insets.top + insets.bottom =》得到的是分割线占用的高度
widthUsed和heightUsed就是item中显示内容要使用的宽高
widthUsed += insets.left + insets.right;得到的是总item的宽高

 final int widthSpec = getChildMeasureSpec(getWidth(), getWidthMode(),
                    getPaddingLeft() + getPaddingRight() + widthUsed, lp.width,
                    canScrollHorizontally());
            final int heightSpec = getChildMeasureSpec(getHeight(), getHeightMode(),
                    getPaddingTop() + getPaddingBottom() + heightUsed, lp.height,
                    canScrollVertically());
            if (shouldMeasureChild(child, widthSpec, heightSpec, lp)) {
                child.measure(widthSpec, heightSpec);
            }

这个是去计算item的宽高,从这里可以看出,分割线的大小被计算到 item的大小中了,也就是说 分割线的大小占用的 item 的大小。
上面的效果图中,最后一列的item会很宽 是因为最后一列没有右边的分割线 所以分配给 item内容显示的大小就是item的大小。

这是谷歌预留的bug,暂时无法解决,除非自己写一个RecyclerVIew!!!

相关文章

网友评论

      本文标题:RecyclerView 分割线 bug 分析

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