我使用GridLayoutManager
作为recyclerview的布局管理器。
mRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
但我想平均分配两列之间的宽度。我怎样才能做到这一点?
尝试在你的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;
}
}
});
您可以使用自定义ItemDecoration,您可以根据需要拆分空间:
SpacesItemDecoration可以帮助您:
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
像下一样设置列数:
mRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
...实际上使网格分成相同宽度的列。
这表明问题出在其他地方,可能是在项目布局中。我想一些空格(填充/边距)是项目向右移动的原因。尝试删除这些间距并检查它是否有效。
如果有帮助,您可以随时使用ItemDecoration添加新的间距,但这不是列的大小不正确的原因。
我认为打开Show Layout Bounds option可能对你有所帮助。