GridLayoutManager 间距不一致
Posted
技术标签:
【中文标题】GridLayoutManager 间距不一致【英文标题】:GridLayoutManager spacing is not consistent 【发布时间】:2018-09-23 13:09:08 【问题描述】:所以我使用RecyclerView
和GridLayoutManager
项目之间的间距在项目周围不一致
这就是它在 4 x 4 网格中的样子
这就是它在 5 x 5 网格中的样子
我已经尝试了this 和this 和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;
我不知道为什么它不适合我
我的回收站视图和项目没有边距或填充
【问题讨论】:
看起来下面的代码有问题,检查它删除并检查int spacingInPixels = getResources().getDimensionPixelSize(R.dimen.spacing); mRecyclerView.addItemDecoration(new SpacesItemDecoration(spacingInPixels));
它用于在我的项目视图周围添加间距我认为这里没有错&R.dimen.spacing = 10dp
看起来是这段代码导致了这个问题items if (parent.getChildLayoutPosition(view) == 0) outRect.top = space; else outRect.top = 0;
outRect.top = 空间;不要在 if 条件之前使用它。您正在 if 条件下对其进行初始化。试试这个链接***.com/questions/28531996/…
@AmitCharkha 你读过我的完整问题吗?我已经提到了这个链接
【参考方案1】:
当您将适配器绑定到回收器视图时。 在适配器中进行布局,提供视图控件大小的布局。 比如adapter_row.xml
<ImageView
android:layout_
android:layout_
android:id="@+id/amIvImage"
android:src="@drawable/a"/>
如果您希望在依赖项下使用的所有设备中的空间都相同。 添加应用级别的gradle文件..
implementation 'com.intuit.sdp:sdp-android:1.0.4'
【讨论】:
我明白了你的意思,但这并不能解决我的问题,如果你告诉我我的代码有什么问题会很有帮助【参考方案2】:您并没有真正说出正确的布局是什么。我假设您希望在第一行的所有项目之上留一个空间。目前,第一项上只有一个顶部空间。您的问题在于以下代码:
// 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)
根据您想要做什么,您可能需要检查一些边缘情况,例如RecyclerView
没有足够的项目来填充最后一行。
【讨论】:
【参考方案3】:我想通了,会给你一些线索。 gridlayoutmanager 正在缩放项目,以便根据您的跨度计数适合所有 htem。所以想象一下 gridlayoutmanager 拿走你的项目并说 我怎样才能拉伸这个项目,使 X 数量可以放在一行中?
我发现最好的方法是使用 constraintLayout。如:
app:layout_constraintDimensionRatio="1:2"
和/或根据您的内容的用例,您可以使用它,以便它与容器一起延伸:
例如。
app:layout_constraintWidth_percent=".51"
app:layout_constraintHeight_percent=".63"
并且不给出任何硬尺寸。当 gridlayoutmanager 想要加强以适合您的项目时,硬尺寸将使间距甚至不会强制一定尺寸。而是让系统缩放项目但保持纵横比。
所有这些示例都适用于您的容器。在您的容器内,您可以像往常一样创建内容,但您可能仍需要 ayout_constraintWidth_percent 以便在项目按比例拉伸时拉伸。
【讨论】:
以上是关于GridLayoutManager 间距不一致的主要内容,如果未能解决你的问题,请参考以下文章
markdown 使用自定义ItemDecoration为Android RecyclerView GridLayoutManager提供相等的列间距
1.Android recycleView万能分隔线 GridLayoutManager布局item左右间距均等(最易懂)
recyclerview gridlayoutmanager 怎么设置列数