ReridlerView GridLayoutManager динамический счетчик диапазона

Я использую следующий код динамически изменить количество пролетов.

val layoutManager = GridLayoutManager(this, 3)
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
    override fun getSpanSize(position: Int): Int {
        when (position) {
            0, 1, 2 -> return 1
            3, 4 -> return 2
            5 -> return 3
            else -> return 1
        }
    }
}

И я получил следующий вывод. Но я хочу, чтобы D и E были горизонтально выровнены по горизонтали. Я не знаю, как это сделать.

На самом деле у меня есть 3 типа в адаптере , HEADER, TYPE_A, TYPE_B. У HEADER должна быть только одна строка, TYPE_A - 3 строки, TYPE_B - 2 строки.

Поэтому я могу получить помощь, чтобы у некоторых столбцов была одна строка, а у некоторых - только 2 строки (по горизонтали одинаково выровнены), а у некоторых - 3 строки.

3 ответа

Решение

В этом случае вы должны сделать вашу сетку более 3-х ячеек. Вам нужно будет выбрать число, которое подходит для всех трех типов ячеек, а 6 - это хорошо, потому что если иметь 3 ячейки по строке, вы должны вернуть 2. Чтобы иметь 2 ячейки по строке, вы должны вернуть 3 и иметь 1 ячейка за строкой вы бы вернули 6:

val layoutManager = GridLayoutManager(this, 6)
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
    override fun getSpanSize(position: Int): Int {
        when (position) {
            0, 1, 2 -> return 2
            3, 4 -> return 3
            5 -> return 6
            else -> return 2
        }
    }
}

Вот мое решение для динамического диапазона, в этом случае максимальный диапазон равен 4, а 12 кратно 4, 3 и 2. //ЧИСЛО ПРОМЕЖУТКА, КОТОРЫЙ ВЫ ХОТИТЕ, - это размер вашего массива

      val mutipleSpan = 12  //least common multiple
val maxSpan = 4//max span count 
val mLayoutManager = object : GridLayoutManager(itemView.context, mutipleSpan){}

mLayoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
            override fun getSpanSize(position: Int): Int {
                val actualSize =  //NUMBER OF THE SPAN THAT YOU WANT
                if(actualSize< maxSpan){
                    return  mutipleSpan/actualSize
                }
                return mutipleSpan/maxSpan
            }
        }

recycler.layoutManager = mLayoutManager 

ИспользоватьFlexBoxLayoutManagerбиблиотеки Google .

Документ описывает, что это допустимое решение.

Другие вопросы по тегам