RecycleView 分割线 从某个角度讲是一种倒退

ItemDecoration(分割线)
我们可以通过该方法添加分割线:
mRecyclerView.addItemDecoration()
ItemDecoration原理参考:https://www.jianshu.com/p/9a796bb23a47

出现问题 :设置分割线,导致item宽度不一样

我在RecyclerView给GridLayoutManager模式设置分割线的问题,在网上找了一些案例,却都有着item宽度大小不等的问题,以鸿洋大神的这篇http://blog.csdn.net/lmj623565791/article/details/45059587为例,divider的宽度变宽了之后,就明显存在问题,如下图所示:

image.png

具体原因是源码里面

   @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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。