在 GridLayoutManager 中的两列之间划分宽度
Divide width between two columns in GridLayoutManager
我使用 GridLayoutManager
作为回收站视图的布局管理器。
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
来达到这个目的,看看 here
还有一些非常好的答案
您可以使用自定义 ItemDecoration 并且可以根据需要拆分 space :
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));
... 实际上使网格拆分为相同宽度的列。
这表明问题出在其他地方,可能在 项目布局 中。我想一些空格(paddings/margins)是导致项目向右移动的原因。尝试删除这些间距并检查它是否有效。
如果有帮助,您可以随时使用 ItemDecoration 添加新的间距,但这不是导致列大小不正确的原因。
我认为开启Show Layout Bounds option可能对您有所帮助。
我写了一个等间距的library,它支持Vertical/Horizontal、LTR/RTL、LinearLayout/GridLayout manager 和Edge inclusion。它基本上是一个文件,因此您可以将该文件复制粘贴到您的代码中。
我试图支持 StaggeredGridLayout
但此布局返回的跨度索引不可靠。我很乐意听到任何建议。
我使用 GridLayoutManager
作为回收站视图的布局管理器。
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
来达到这个目的,看看 here
还有一些非常好的答案
您可以使用自定义 ItemDecoration 并且可以根据需要拆分 space :
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));
... 实际上使网格拆分为相同宽度的列。
这表明问题出在其他地方,可能在 项目布局 中。我想一些空格(paddings/margins)是导致项目向右移动的原因。尝试删除这些间距并检查它是否有效。
如果有帮助,您可以随时使用 ItemDecoration 添加新的间距,但这不是导致列大小不正确的原因。
我认为开启Show Layout Bounds option可能对您有所帮助。
我写了一个等间距的library,它支持Vertical/Horizontal、LTR/RTL、LinearLayout/GridLayout manager 和Edge inclusion。它基本上是一个文件,因此您可以将该文件复制粘贴到您的代码中。
我试图支持 StaggeredGridLayout
但此布局返回的跨度索引不可靠。我很乐意听到任何建议。