所以我使用RecyclerView
与GridLayoutManager
项目之间的间距在项目周围不一致
这是它在4 x 4网格中的外观
这是它在5 x 5网格中的外观
的多种解决方案但没有任何对我有用
以下是我如何设置我的适配器
mLayoutManager = new GridLayoutManager(mContext, 5);
mRecyclerView.setLayoutManager(mLayoutManager);
int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.spacing);
mRecyclerView.addItemDecoration(new SpacesItemDecoration(spacingInPixels));
这是我的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.left = space;
outRect.right = space;
outRect.top = space;
outRect.bottom = space;
// Add top margin only for the first item to avoid double space between items
if (parent.getChildLayoutPosition(view) == 0)
{
outRect.top = space;
}
else
{
outRect.top = 0;
}
}
}
我不知道为什么它不适合我
我的recyclerview&没有任何边距或填充。项目
答案 0 :(得分:0)
将适配器绑定到Recycler视图时。 在适配器make布局中提供视图控件大小的布局。 像adapter_row.xml
<ImageView
android:layout_width="@dimen/_100sdp"
android:layout_height="@dimen/_100sdp"
android:id="@+id/amIvImage"
android:src="@drawable/a"/>
如果你想在下面依赖的所有设备中使用空间是相同的。 添加应用级gradle文件..
implementation 'com.intuit.sdp:sdp-android:1.0.4'
答案 1 :(得分:0)
你真的不知道什么是正确的布局。我假设你想在第一行的所有项目之上留一个空格。目前,第一个项目只有一个顶部空间。您的问题是使用以下代码:
// Add top margin only for the first item to avoid double space between items
if (parent.getChildLayoutPosition(view) == 0)
{
outRect.top = space;
}
else
{
outRect.top = 0;
}
此代码仅为RecyclerView
中的第一项提供顶部空间,因为parent.getChildLayoutPosition(view)
为您提供适配器位置。您需要检查该视图是否位于RecyclerView
的第一行中并进行相应调整。
再看一遍,我看到垂直单元格之间的间距大于水平单元格之间的间距。发生这种情况是因为您在单元格的顶部和底部应用了间距。如果要在所有单元格周围使用相同的间距,则需要执行以下操作:
在所有单元格的顶部和左侧应用间距。不要自动应用右侧或底部间距。这将解决您的大多数问题,但不会将间距应用于最右侧的列或底行。
检测单元格何时位于最右侧列并将间距应用于右侧。对于4x4网格,这些单元格的位置将是每四个适配器位置。因此,适配器位置以获得正确的间距是3,7,11等或(position + 1) % 4 == 0
。
检测单元格何时位于底行并将间距应用于底部。对于4x4网格,最后一行中的项目距离RecyclerView
或(maxPosition - position)中的最后一个位置是4或更少。 4。
根据您想要做什么,您可能需要检查一些边缘情况,例如RecyclerView
没有足够的项目来填充最后一行。
答案 2 :(得分:0)
我想出了这一点,会给你一些线索。 gridlayoutmanager会根据您的跨度计数缩放项目,使其适合所有样式。因此imageine使gridlayoutmanager拿走您的物品并说我如何拉伸该物品,使X数可以连续放置?
我发现的最佳方法是使用constraintLayout。例如:
app:layout_constraintDimensionRatio="1:2"
和/或根据您的内容用例,您可以使用它,使其与容器一起延伸:
例如
app:layout_constraintWidth_percent=".51"
app:layout_constraintHeight_percent=".63"
,并且不给出任何严格的尺寸。当gridlayoutmanager想要增强强度以适合您的项目时,硬尺寸将使间距不均匀,甚至迫使其达到一定大小。而是让系统缩放项目,但保持宽高比。
所有这些示例均适用于您的容器。在容器内,您可以像平常一样创建内容,但是您可能仍需要ayout_constraintWidth_percent,以便在项目按比例拉伸时可以拉伸。