android - 已解决:使用 ItemDecorator 添加间距后的 Grid RecyclerView 空白
问题描述
我有一个 3 列网格回收视图,当我使用自定义项目装饰在项目之间添加空间时,回收器视图中的一些项目会在它们上获得空白,如图所示。
装饰者
class GridRecyclerItemDecorator(private val numberOfColumns: Int, private val rowSpacingDP: Float = 0f, private val columnSpacingDP: Float = 0f, private val edgeSpacingVerticalDP: Float = 0f, private val edgeSpacingHorizontalDP: Float = 0f) : RecyclerView.ItemDecoration() {
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
val position = parent.getChildAdapterPosition(view)
val numberOfRows = (parent.adapter?.itemCount?:-1)/numberOfColumns
val column = position % numberOfColumns
val row = position / numberOfColumns
val context = view.context
///horizontal
when(column){
0 -> {
outRect.left = convertDpToPixel(edgeSpacingVerticalDP,context)
outRect.right = convertDpToPixel(columnSpacingDP/2, context)
}
numberOfColumns-1 -> {
outRect.left = convertDpToPixel(columnSpacingDP/2, context)
outRect.right = convertDpToPixel(edgeSpacingVerticalDP, context)
}
else -> {
outRect.left = convertDpToPixel(columnSpacingDP/2, context)
outRect.right = convertDpToPixel(columnSpacingDP/2, context)
}
}
//vertical
when(row){
0 -> {
outRect.top = convertDpToPixel(edgeSpacingHorizontalDP,context)
outRect.bottom = convertDpToPixel(rowSpacingDP/2, context)
}
numberOfRows -> {
outRect.top = convertDpToPixel(rowSpacingDP/2, context)
outRect.bottom = convertDpToPixel(edgeSpacingHorizontalDP, context)
}
else -> {
outRect.top = convertDpToPixel(rowSpacingDP/2, context)
outRect.bottom = convertDpToPixel(rowSpacingDP/2, context)
}
}
}
fun convertDpToPixel(dp: Float, context: Context?): Int {
return if (context != null) {
val resources = context.resources
val metrics = resources.displayMetrics
(dp * (metrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)).roundToInt()
} else {
val metrics = Resources.getSystem().displayMetrics
(dp * (metrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)).roundToInt()
}
}
}
项目布局
<com.google.android.material.card.MaterialCardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardCornerRadius="5dp"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/ivHomeCategoryImage"
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="fitXY"
android:contentDescription="categories"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
回收站设置
binding.rvShopCategoriesList.apply {
adapter = homeCategoryAdapter
addItemDecoration(
GridRecyclerItemDecorator(
3,
8f,
8f,
8f,
8f
)
)
}
我从我身边检查了我所知道的一切,但我仍然无法弄清楚这是什么原因。提前致谢
编辑:我能够通过在 ViewHolder 布局文件中进行某些更改来解决此问题。问题实际上与布局文件有关
解决方案
推荐阅读
- keras - 在 Keras 中连接层
- javascript - 单击标记时如何将数据显示到文本字段
- javascript - 当“输入”被编程方法更改时,“更改”事件不会调用
- java - 霍夫曼压缩压缩文件比原始文件大
- bash - 在 Google-Cloud 的不同本地化中合并同名的 fastq.gz 文件
- reactjs - 当我们只能使用自定义钩子时,为什么还要使用 Provider 和 useContext 呢?
- swift - Firebase 我可以检索用户的电子邮件地址,但我不能在 IOS 客户端中使用它
- python - 为什么熊猫在字符串末尾添加“.0”?
- javascript - ajax-bootstrap-select 是否支持 liveSearch?
- android - 从 Bundle 中插入字符串到 ArrayList 中