Взвешенная сетка не отображается правильно с различными весами и размерами - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь создать Grid Layout (в качестве диспетчера макетов для просмотра макулатуры). Для некоторых предметов я бы хотел иметь вес.

Он отлично работает, когда вес элемента равен номерам столбцов. но когда это меньше, чем это странно. Например, если количество столбцов в GridLayoutManager равно 3, и я установил вес первого элемента, равный 3, это выглядит следующим образом:

enter image description here Теперь, если с такое же количество столбцов (3) Я установил вес первого элемента равным 2, он выглядит следующим образом:

enter image description here

Как это исправить?

Кроме того, я определил оформление предметов для расстояния между предметами, и оно также выглядит не выровненным:

enter image description here

Есть идеи исправить?

Мои коды:

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

}

}

...