简介
解决了在使用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间距 均分 完美布局