RecyclerView GridLayoutManager列间距

GridLayout模式的时候,如果默认的列宽和比RecyclerView的容量小,那么就会每一列的右侧添加一个间距;

这个间距会导致RecyclerView整体向左偏移的一个效果;

要干掉这个偏移,大体可以通过以下3种手段:

  • 算好RecyclerView的容量大小(即,去掉padding等之后的实际宽度),然后设置列宽的和正好等于这个宽度;
  • 把第一列以外的列往右移;
  • 把整体往右移,然后把第一列以外的往左移;

思路很简单;

要实现列的移动需要用到RecyclerView.ItemDecoration,以下是左移的示例代码;

public class MyGridSpacingItemDecoration extends RecyclerView.ItemDecoration {
    private final int column;
    private final int space;

    public MyGridSpacingItemDecoration(int column, int space) {
        this.column = column;
        this.space = space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        int pos = parent.getChildAdapterPosition(view);
        int mod = pos % column;
        LogUtil.v("getItemOffsets", "pos:" + pos + ", mod:" + mod + ", space:" + space);
        outRect.left = -space * mod;
    }
}

调用;

        mPictureList.setLayoutManager(new GridLayoutManager(this, column));
        WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        int width = dm.widthPixels;
        int spaceWidth = (width - Utils.dpToPx(30) - getResources().getDimensionPixelSize(R.dimen.property_repair_picture_item_size) * column) / column;
        mPictureList.addItemDecoration(new MyGridSpacingItemDecoration(column, spaceWidth));

猜你喜欢

转载自blog.csdn.net/weixin_39821531/article/details/89159337