1. 说明
上节课我们已经说了,RecyclerView在显示条目的时候,会有一个问题,就是如果样式是GridView的话,那么最后一列的宽度比前边几列都要宽,而且宽度是第一列宽度加上分割线的宽度,或者第二列的宽度加上分割线的宽度,那么下边我们就通过源码来分析下。
2. 源码分析
public void measureChild(View child, int widthUsed, int heightUsed) {
final LayoutParams lp = (LayoutParams) child.getLayoutParams();
final Rect insets = mRecyclerView.getItemDecorInsetsForChild(child);
// 会不断的回调 getItemOffsets()方法
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);
}
}
通过阅读源码我们知道,分割线所留出来的位置其实是占用了子View的位置,所以才会出现有的条目宽度不一的情况,这个bug可能不能去解决,因为这个是Google留下的。
如下图所示: