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));