@SimpleName

Как создать два ровных ряда в recycler-view?

Нужен recycler view (grid layout) с двумя ровными рядами картинок (отступы по сторонам recycler view и между картинками должны быть одинаковыми). Как это можно сделать?

Вот код layout, на котором работает recycler-view
Вот код layout, на котором работает recycler-view
<android.support.v7.widget.CardView xmlns:tools="http://schemas.android.com/tools"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:background="@color/colorPrimary"
    card_view:cardUseCompatPadding="true"
    card_view:cardCornerRadius="8dp"
    android:layout_marginBottom="16dp">

    <ImageView
        android:id="@+id/tile_picture"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        tools:src="@drawable/kfc" />

</android.support.v7.widget.CardView>

А вот что получается.
5c2bae0b888c1198402879.png
Вертикальная ориентация (для наглядности проблемы)
5c2c93a40db6c366106080.png
  • Вопрос задан
  • 58 просмотров
Решения вопроса 1
@Gnoemes
Как вариант можешь установить ширину карточки "match_parent", а отступы указать через RecyclerView.ItemDecorator.
Декоратор

spacing - расстояние между элементами
margin - отступ между крайними элементами и экраном, по умолчанию равно spacing

import android.graphics.Rect
import android.view.View
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView

class GridItemDecorator(
        private val spacing: Int,
        private val margin: Int = spacing
) : RecyclerView.ItemDecoration() {

    private val halfSpacing = spacing / 2

    override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
        val columns = (parent.layoutManager as? GridLayoutManager)?.spanCount ?: 1
        val rows = parent.adapter?.itemCount?.div(columns) ?: 1

        val pos = parent.getChildAdapterPosition(view)

        fun setTopSpacing() {
            if (pos / columns + 1 == 1) {
                outRect.top = margin
            } else {
                outRect.top = halfSpacing
            }
        }

        fun setBottomSpacing() {
            if (pos / columns + 1 == rows) {
                outRect.bottom = margin
            } else {
                outRect.bottom = halfSpacing
            }
        }

        fun setLeftSpacing() {
            if (pos % columns == 0) {
                outRect.left = margin
            } else {
                outRect.left = halfSpacing
            }
        }

        fun setRightSpacing() {
            if (pos % columns == columns - 1) {
                outRect.right = margin
            } else {
                outRect.right = halfSpacing
            }
        }

        setTopSpacing()
        setBottomSpacing()
        setLeftSpacing()
        setRightSpacing()
    }
}

5c2cd234a1cfe583817132.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
BostonGene Москва
от 100 000 до 200 000 руб.
Digital Horizon Москва
от 150 000 руб.
Sidenis Томск
До 170 000 руб.