Я пытаюсь создать Grid Layout (в качестве диспетчера макетов для просмотра макулатуры). Для некоторых предметов я бы хотел иметь вес.
Он отлично работает, когда вес элемента равен номерам столбцов. но когда это меньше, чем это странно. Например, если количество столбцов в GridLayoutManager равно 3, и я установил вес первого элемента, равный 3, это выглядит следующим образом:
Теперь, если с такое же количество столбцов (3) Я установил вес первого элемента равным 2, он выглядит следующим образом:
Как это исправить?
Кроме того, я определил оформление предметов для расстояния между предметами, и оно также выглядит не выровненным:
Есть идеи исправить?
Мои коды:
val columns = 3
val recyclerViewLayoutManager = GridLayoutManager(context,columns) .apply {
orientation = LinearLayoutManager.VERTICAL
}
recyclerViewLayoutManager.spanSizeLookup = (object : SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return if(position==0) columns else 1
}
})
val recyclerView: RecyclerView = view!!.findViewById(R.id.recycle1)
recyclerView.apply {
layoutManager = recyclerViewLayoutManager
adapter = ItemAdapter(items)
addItemDecoration(GridSpacingItemDecoration(20))
setHasFixedSize(true)
}
Это предмет украшения:
class GridSpacingItemDecoration(space: Int) : RecyclerView.ItemDecoration() {
var spacing: Int = space
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
super.getItemOffsets(outRect, view, parent, state)
val layoutManager = parent.layoutManager as GridLayoutManager?
val position = parent.getChildAdapterPosition(view) // item position
val spanCount: Int
val column: Int
// Check the last item and is alone. Then set the parent's width
if (position == parent.adapter!!.itemCount - 1 && position % 2 == 0) {
spanCount = 1
outRect.left = spacing
outRect.right = parent.width - spacing
} else {
spanCount = layoutManager!!.spanCount
column = position % spanCount
outRect.left = spacing * (spanCount - column) / spanCount
outRect.right = spacing * (column + 1) / spanCount
}
if (position < spanCount) {
outRect.top = spacing
}
outRect.bottom = spacing
}
}