如何在 GridLayout 中设置 RecyclerView 项目装饰
How to set RecylerView item decoration in a GridLayout
我有 2 个跨度的简单网格布局,我的 RecyclerView
项目布局如下所示:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.card.MaterialCardView
android:id="@+id/categoryCardView"
android:layout_width="170dp"
android:layout_height="100dp"
app:cardBackgroundColor="@color/colorPrimary"
app:cardCornerRadius="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
我想要的基本都是space四面八方,所以我这样设置物品装饰:
recylcerView.addItemDecoration(SpacingItemDecorator(16))
class SpacingItemDecorator (private val padding: Int): RecyclerView.ItemDecoration() {
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
super.getItemOffsets(outRect, view, parent, state)
// outRect.right = padding
// outRect.top = padding * 2
outRect.top = padding
outRect.right = padding/2
outRect.left = padding/2
}
}
但如我所料,我遇到了错误的行为。 top/bottom 没问题,但是例如,如果我将 16 个填充传递给 SpacingItemDecorator
(正如我所说的,我连续有 2 个项目),第一个项目将按预期在左侧得到 8,但在项目之间,space 将是 16(第一项右侧 8 个,第二项左侧 8 个)。
但最奇怪的是,第二个项目也从右边得到 16,而不是只有 8(右填充)
我的问题是:
为什么我行中的第二个项目会从右边得到 16 个填充,而不是第一个项目从左边得到 8 个?
如何为所有尺寸设置相等的填充?
为每个 RecyclerView 项目获取 8dp
填充您可以将 RecyclerView 填充设置为 4dp
:
<androidx.recyclerview.widget.RecyclerView
android:padding="4dp"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
/>
现在在您的 ItemDecorator 中添加:
class SpacingItemDecorator (private val padding: Int) : RecyclerView.ItemDecoration()
{
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
)
{
super.getItemOffsets(outRect, view, parent, state)
outRect.top = padding
outRect.bottom = padding
outRect.left = padding
outRect.right = padding
}
}
现在在 onCreate
(或您设置 RecylcerView 的任何地方)您可以添加此项目装饰器并将填充设置为 4
:
val x = (resources.displayMetrics.density * 4).toInt() //converting dp to pixels
recyclerView.addItemDecoration(SpacingItemDecorator(x)) //setting space between items in RecyclerView
结果:
只需将您的 cardview 宽度布局设置为匹配父级,例如边距为 8dp。以及 wrap_content 的身高。在处理 recyclerViews 时。最好避免为宽度和高度设置特定的测量值。相信我,这会更容易,看起来更好。
P.s。在 activity/fragment 中设置布局尺寸会影响性能。 announce/define 你 xml 文件中的 UI 也更好。
我有 2 个跨度的简单网格布局,我的 RecyclerView
项目布局如下所示:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.card.MaterialCardView
android:id="@+id/categoryCardView"
android:layout_width="170dp"
android:layout_height="100dp"
app:cardBackgroundColor="@color/colorPrimary"
app:cardCornerRadius="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
我想要的基本都是space四面八方,所以我这样设置物品装饰:
recylcerView.addItemDecoration(SpacingItemDecorator(16))
class SpacingItemDecorator (private val padding: Int): RecyclerView.ItemDecoration() {
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
super.getItemOffsets(outRect, view, parent, state)
// outRect.right = padding
// outRect.top = padding * 2
outRect.top = padding
outRect.right = padding/2
outRect.left = padding/2
}
}
但如我所料,我遇到了错误的行为。 top/bottom 没问题,但是例如,如果我将 16 个填充传递给 SpacingItemDecorator
(正如我所说的,我连续有 2 个项目),第一个项目将按预期在左侧得到 8,但在项目之间,space 将是 16(第一项右侧 8 个,第二项左侧 8 个)。
但最奇怪的是,第二个项目也从右边得到 16,而不是只有 8(右填充)
我的问题是:
为什么我行中的第二个项目会从右边得到 16 个填充,而不是第一个项目从左边得到 8 个?
如何为所有尺寸设置相等的填充?
为每个 RecyclerView 项目获取 8dp
填充您可以将 RecyclerView 填充设置为 4dp
:
<androidx.recyclerview.widget.RecyclerView
android:padding="4dp"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
/>
现在在您的 ItemDecorator 中添加:
class SpacingItemDecorator (private val padding: Int) : RecyclerView.ItemDecoration()
{
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
)
{
super.getItemOffsets(outRect, view, parent, state)
outRect.top = padding
outRect.bottom = padding
outRect.left = padding
outRect.right = padding
}
}
现在在 onCreate
(或您设置 RecylcerView 的任何地方)您可以添加此项目装饰器并将填充设置为 4
:
val x = (resources.displayMetrics.density * 4).toInt() //converting dp to pixels
recyclerView.addItemDecoration(SpacingItemDecorator(x)) //setting space between items in RecyclerView
结果:
只需将您的 cardview 宽度布局设置为匹配父级,例如边距为 8dp。以及 wrap_content 的身高。在处理 recyclerViews 时。最好避免为宽度和高度设置特定的测量值。相信我,这会更容易,看起来更好。
P.s。在 activity/fragment 中设置布局尺寸会影响性能。 announce/define 你 xml 文件中的 UI 也更好。