尝试在你的recyclerView
中添加以下内容:
mRecyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view); // item position
int spanCount = 2;
int spacing = 10;//spacing between views in grid
if (position >= 0) {
int column = position % spanCount; // item column
outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing)
outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing)
if (position < spanCount) { // top edge
outRect.top = spacing;
}
outRect.bottom = spacing; // item bottom
} else {
outRect.left = 0;
outRect.right = 0;
outRect.top = 0;
outRect.bottom = 0;
}
}
});
像您这样设置列数:
mRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
实际上,它会使网格分成相同宽度的列。
这表明问题可能出现在 项目布局 中的其他地方。我认为一些空白区域(填充/边距)导致项目向右移动。尝试删除这些间隔并检查是否正常工作。
如果需要,您可以始终使用ItemDecoration添加新的间隔,但这不是导致列大小不正确的原因。
我认为打开显示布局边界选项对您可能有帮助。
我尝试支持StaggeredGridLayout
,但是它返回的跨度索引不可靠。如果有任何建议,我将非常乐意听取。
public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
private int space;
public SpacesItemDecoration(int space) {
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, View view,
RecyclerView parent, RecyclerView.State state) {
outRect.bottom = space;
// Add top margin only for the first item to avoid double space between items
if (parent.getChildLayoutPosition(view)%2 == 0) {
outRect.left = space;
outRect.right = space;
} else {
outRect.right = space;
}
}
}
int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.spacing);
spacesItemDecoration = new SpacesItemDecoration(spacingInPixels);
recyclerview.addItemDecoration(spacesItemDecoration);
您可以根据需要更改outRect.left和outRect.Right