RecyclerView 瀑布流间隔问题

935 阅读1分钟

RecyclerView作为Android常用控件之一,其功能十分强大,不仅支持横向,竖向列表展示还支持流式布局展示。RecyclerView实现流式布局时,一般需要添加分割线。大多数都是屏幕左右间隔相等。今天我们来实现一下当只有两列布局时,布局与屏幕,布局与布局之间间距都相等。效果如下:

从效果图中可以看出图片135和图片141之间的间隔与图片135和屏幕边缘相同。实现三个间距都是相等的,看到这里,很多人可能就觉得这个十分简单,直接在布局中设置marginLeft和marginRight 根据显示的位置不同,设置不同的值,如果是一组不变得数据还好,确实是可以实现,但是支持下拉刷新和上拉加载时,数据就会变化,导致布局错位(不信自己可以手动尝试)。

下面我们通过自定义RecyclerView.ItemDecoration()解决这个问题。

class GridSpaceItemDecoration(private val spanCount:Int, private val spacing:Int):RecyclerView.ItemDecoration() {
    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
        val layoutParams: StaggeredGridLayoutManager.LayoutParams =
            view.layoutParams as StaggeredGridLayoutManager.LayoutParams
        val spanIndex: Int = layoutParams.spanIndex 
        val position: Int = parent.getChildAdapterPosition(view)
        outRect.bottom = spacing 
        if (position == 0 || position == 1) {
            outRect.top = spacing * spanCount
        } else {
            outRect.top = 0
        }
        if (spanIndex % spanCount == 0) { 
            outRect.left = spacing
            outRect.right = spacing / spanCount
        } else {// 右边
            outRect.left = spacing / spanCount
            outRect.right = spacing
        }

    }
}

通过StaggeredGridLayoutManager获取当前item的位置,然后通过位置计算当前Item位于屏幕左右。设置合理的间距。