1.先看效果问题图

看这张图片不能发现,最后一个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!!!
网友评论