Staggered Grid Layout Manager, который работает в обеих ориентациях

Что я пытаюсь сделать:

Я пытаюсь создать макет сетки в шахматном порядке, который принимает элементы с различной шириной и высотой. Макет динамически перемещает элементы, чтобы они не перекрывались.

Что я пробовал:

Я изучил возможность использования StaggeredGridLayoutManager по умолчанию, но оказалось, что он работает только в одной ориентации (т. е. по вертикали или по горизонтали). Кроме того, каждая библиотека или учебник, с которыми я сталкивался, также имеют дело только с элементами, содержащими либо динамическую высоту, либо динамическую ширину, но не то и другое одновременно.

Есть ли способ сделать так, чтобы StaggeredGridLayoutManager динамически растягивался как по вертикали, так и по горизонтали? Или мне придется создать свой собственный менеджер компоновки? Если последнее, может ли кто-нибудь указать мне правильное направление, чтобы узнать, как создать такой менеджер компоновки?


person Matthew Steinhardt    schedule 09.07.2019    source источник


Ответы (1)


Вместо StaggeredGridLayoutManager можно использовать GridLayoutManager с spanSizeLookup. Используя spanSizeLookup, мы можем указать диапазон столбцов.

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
 item[position].columnSpan
}
}

При создании GridLayoutManager укажите максимальное количество таких столбцов.

layoutManager = GridLayoutManager(context, MAX_NUM_COL)

Диапазон строк может быть применен путем вычисления высоты с использованием коэффициента охвата и высоты родительского элемента.

person Varsha Ravikumar    schedule 20.10.2019
comment
Спасибо за ответ! Однако не будет ли это манипулировать только шириной или высотой (в зависимости от ориентации LayoutManager)? Мне нужно манипулировать оба независимо друг от друга - person Matthew Steinhardt; 22.10.2019
comment
используя spanSizeLookup, можно манипулировать только columnSpan. Чтобы применить диапазон строк, вычислите высоту в адаптере представления ресайклера, используя родитель как (общая высота представления ресайклера) и текущую информацию о диапазоне строк для каждого элемента rowHeight = (recyclerView.height * rowSpan)/MAX_ROW - person Varsha Ravikumar; 22.10.2019