Android Recyclerview GridLayoutManager间距均分

867 阅读1分钟

简介

解决了在使用GridLayoutManager时,RecyclerView每个item的需要相等间距问题,如果使用padding 或者 margin标签属性,会出现中间的item间距是边上item的两倍的问题

直接上解决办法

用到了 RecyclerView.addItemDecoration类

	public abstract static class ItemDecoration {
        public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) {
            onDraw(c, parent);
        }
        public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent,
                @NonNull State state) {
            onDrawOver(c, parent);
        }
        public void getItemOffsets(@NonNull Rect outRect, @NonNull View view,
                @NonNull RecyclerView parent, @NonNull State state) {
            getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(),
                    parent);
        }
    }

主要用到的方法为 getItemOffsets,检索所以的item并给定所指定的偏移量。 类似于padding或margin。 默认实现将outRect的边界设置为0并返回。 如果此ItemDecoration不影响项目视图的位置,则应在返回之前将outRect所有四个字段(left,top,right,bottom)设置为零。 如果需要访问适配器以获取其他数据,则可以调用getChildAdapterPosition(View)来获取getChildAdapterPosition(View)的适配器位置。

参数:

  • outRect – 接收输出的Rect。
  • view – 要装饰的子视图
  • parent – 要被装饰的RecyclerView
  • state – RecyclerView的当前状态。

代码:

/**
 * @description 两列的GridLayoutManager RecyclerView,想要实现效果是,每个Item之间都有space2Dp个间距
 * @author msp
 * @time 2021/3/4
 */
class MainSpaceDecoration(context: Context, space2Dp: Int) : RecyclerView.ItemDecoration() {

    //dp转px
    val delta: Int = DisplayUtils.dp2px(context, space2Dp.toFloat())

    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
        outRect.top = delta
        if (parent.getChildAdapterPosition(view) % 2 == 0) {
            outRect.left = delta
            outRect.right = delta
        } else if (parent.getChildAdapterPosition(view) % 2 == 1) {
            outRect.left = 0
            outRect.right = delta
        }
    }
}

最后再放一个讲的很好的连接 Android Recyclerview间距 均分 完美布局