GridLayoutManager间距不一致

时间:2018-04-13 08:26:20

标签: android android-layout layout android-recyclerview recyclerview-layout

所以我使用RecyclerViewGridLayoutManager项目之间的间距在项目周围不一致

这是它在4 x 4网格中的外观

这是它在5 x 5网格中的外观

我已经尝试了thisthis以及this

的多种解决方案

但没有任何对我有用

以下是我如何设置我的适配器

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&没有任何边距或填充。项目

3 个答案:

答案 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,以便在项目按比例拉伸时可以拉伸。