ItemDecoration(分割线)
我们可以通过该方法添加分割线:
mRecyclerView.addItemDecoration()
ItemDecoration原理参考:https://www.jianshu.com/p/9a796bb23a47
出现问题 :设置分割线,导致item宽度不一样
我在RecyclerView给GridLayoutManager模式设置分割线的问题,在网上找了一些案例,却都有着item宽度大小不等的问题,以鸿洋大神的这篇http://blog.csdn.net/lmj623565791/article/details/45059587为例,divider的宽度变宽了之后,就明显存在问题,如下图所示:
具体原因是源码里面
@Override
public void getItemOffsets(Rect outRect, int itemPosition,
RecyclerView parent) {
int spanCount = getSpanCount(parent);
int childCount = parent.getAdapter().getItemCount();
if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部
{
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
} else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边
{
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(),
mDivider.getIntrinsicHeight());
}
}
最后一列的时候并没有设置间距,2,3之间的间距,是通过2设置间距实现的,也就是说3比1和2,宽了一个分割线的大小。当设置的分割线越大,显示出来的效果越明显。
解决问题:
参考这个文章:https://blog.csdn.net/HZHAboom/article/details/78629937
关键代码
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
int spanCount = getSpanCount(parent);
int childCount = parent.getAdapter().getItemCount();
boolean isLastRow = isLastRow(parent, itemPosition, spanCount, childCount);
int top = 0;
int left;
int right;
int bottom;
int eachWidth = (spanCount - 1) * mDividerWidth / spanCount;
left = itemPosition % spanCount * (mDividerWidth - eachWidth);
right = eachWidth - left;
bottom = mDividerWidth;
if (isLastRow){
bottom = 0;
}
outRect.set(left, top, right, bottom);
}
当我认为解决问题发现在某些情况下,还是会有问题,这里我举个例子
假如我们设置分割线mDividerWidth为4px,spanCount 为3,则
eachWidth =2*4/3=2.6,因为为int类型,所有会变成2
每个控件占有的分割线空间
第一个item所占有的分割线空间:(0)+(2)=2
第二个item所占有的分割线空间:(2)+(2)=4
第三个item所占有的分割线空间:(4)+(0)=4
我们可以发现,分割线其实大小不一样了,但是算是一种改进吧!
总结:
第一种方案:实现分割线大小一定相等,但是出现的问题是如果分割线间距设置过大,最后一个item会变得很小
第二方案:实现了不管分割线间距设置多大,分割线的大小还是差不多相等,最后一个item也不会变得很小,肉眼难分辨
如果想实现精准的话,还是用以前的GridView这个控件去实现分割线吧!从这个角度来说,gridView还是优于RecycleView的
开发中运用:如果分割线小,用方案一,分割线大用方案二,精准分割用GridView