Как установить интервал между столбцами с помощью RecyclerView с помощью GridLayoutManager? Установка полей / отступов внутри моего макета не имеет никакого эффекта.
251
Как установить интервал между столбцами с помощью RecyclerView с помощью GridLayoutManager? Установка полей / отступов внутри моего макета не имеет никакого эффекта.
GridLayoutManager
переопределятьgenerateDefaultLayoutParams()
и родить?Ответы:
RecyclerViews поддерживают концепцию ItemDecoration : специальные смещения и прорисовку каждого элемента. Как видно из этого ответа , вы можете использовать
Затем добавьте его через
источник
RecyclerView
(и используетеclipToPadding="false"
), то вы можете немного изменить структуру. Однако, если вы этого не сделаете, вы просто переместите проверку if в последний раз (так как вы все равно хотите использовать нижний отступ для последнего элемента).GridLayoutManager
. Ответ не будет работать на нескольких столбцов / строк макетовСледующий код работает хорошо, и каждый столбец имеет одинаковую ширину:
использование
1. нет края
2. с краем
источник
Ниже приведено пошаговое простое решение, если вам нужно одинаковое расстояние между элементами и одинаковые размеры элементов.
ItemOffsetDecoration
Реализация
В исходном коде добавьте
ItemOffsetDecoration
к вашемуRecyclerView.
значению Item смещение, равное половине размера фактического значения, которое вы хотите добавить в качестве пробела между элементами.Кроме того, установите значение смещения элемента в качестве отступа для его
RecyclerView
и укажитеandroid:clipToPadding=false
.источник
Попробуй это. Это позаботится о равном расстоянии вокруг. Работает как с List, Grid, так и с StaggeredGrid.
Edited
Обновленный код должен обрабатывать большинство угловых случаев с пролетами, ориентацией и т. Д. Обратите внимание, что при использовании setSpanSizeLookup () с GridLayoutManager установка setSpanIndexCacheEnabled () рекомендуется из соображений производительности.
Обратите внимание, что в StaggeredGrid, похоже, есть ошибка, из-за которой индекс дочерних элементов становится странным и трудным для отслеживания, поэтому приведенный ниже код может не очень хорошо работать с StaggeredGridLayoutManager.
Надеюсь, поможет.
источник
Следующий код будет обрабатывать StaggeredGridLayoutManager, GridLayoutManager и LinearLayoutManager.
Тогда используйте это
источник
SpaceItemDecoration
Фактически добавляют отступы родителя (вид утилизатора).halfSpace
заполнение появилось (справа), когда я не установил заполнение для родителя в xmlВот решение, которое не требует "spanCount" (количество столбцов), я использую его, потому что я использую GridAutofitLayoutManager (вычисляет количество столбцов в соответствии с требуемым размером ячейки)
(имейте в виду, что это будет работать только на GridLayoutManager )
Вот GridAutofitLayoutManager , кто-нибудь заинтересован:
В заключение:
источник
layoutManager.getPosition(view)
после этого проверьте, равна ли позиция нулю, которая будет вашим заголовком. Кроме того, этот способ позволит вам добавить еще один заголовок в любые позиции, которые вы хотите :)Существует только одно простое решение, которое вы можете запомнить и реализовать там, где это необходимо. Нет ошибок, нет сумасшедших расчетов. Поместите поле в макет карты / элемента и укажите тот же размер, что и для отступа в RecyclerView:
item_layout.xml
activity_layout.xml
ОБНОВИТЬ:
источник
Если вы хотите исправить размер вашего
RecyclerView
элемента на всех устройствах. Вы можете сделать этоrecyclerview_item.xml
dimens.xml
Деятельность
источник
Выбранный ответ почти идеален, но в зависимости от места ширина предметов может быть не одинаковой. (В моем случае это было критично). Итак, я получил этот код, который немного увеличивает пространство, поэтому элементы имеют одинаковую ширину.
источник
columnCount == 1 -> { outRect.left = space outRect.right = space }
Скопировал предоставленный код @edwardaa, и я сделал его идеальным для поддержки RTL:
источник
Ответы выше разъяснили способы установки обработки полей GridLayoutManager и LinearLayoutManager.
Но для StaggeredGridLayoutManager ответ Пирдада Сакхизады говорит: «С StaggeredGridLayoutManager это может работать не очень хорошо». Должна быть проблема с IndexOfSpan.
Вы можете получить это следующим образом:
источник
Немного отличается от ответа Эдвардаа, разница в том, как определяется столбец, потому что в таких случаях, как элементы с различной высотой, столбец не может быть определен просто%
spanCount
источник
источник
Вот моя модификация,
SpacesItemDecoration
которая может занимать numOfColums и пространство одинаково сверху, снизу, слева и справа .и используйте приведенный ниже код в вашей логике.
источник
Существует очень простое и в то же время гибкое решение этой проблемы с использованием только XML, который работает на каждом LayoutManager.
Предположим, вы хотите равный интервал X (например, 8dp).
Оберните ваш элемент CardView в другой макет
Дайте внешнему макету отступ X / 2 (4dp)
Сделать внешний фон Layout прозрачным
...
...
и это все. У вас идеальный интервал X (8dp).
источник
Для тех, у кого проблемы с staggeredLayoutManager (например, https://imgur.com/XVutH5u )
методы recyclerView:
иногда возвращает -1 в качестве индекса, поэтому мы можем столкнуться с проблемами при настройке itemDecor. Мое решение - переопределить устаревший метод ItemDecoration:
вместо новичка
как это:
Кажется, работает для меня до сих пор :)
источник
Ответы на этот вопрос кажутся более сложными, чем они должны быть. Вот мой взгляд на это.
Допустим, вы хотите 1dp интервал между элементами сетки. Сделайте следующее:
источник
Это также будет работать
RecyclerView
с заголовком.источник
Ответ yqritc отлично сработал для меня. Я использовал Kotlin, однако, так что вот эквивалент этого.
все остальное тоже самое.
источник
Для пользователей StaggeredGridLayoutManager , будьте осторожны, множество ответов здесь, включая наиболее проголосовавших, вычисляет столбец элемента с кодом ниже:
что предполагает, что 1-й / 3-й / 5-й / .. элементы всегда расположены с левой стороны, а 2-й / 4-й / 6-й / .. элементы всегда расположены с правой стороны. Всегда ли это предположение верно? Нет .
Допустим, ваш 1-й предмет имеет высоту 100dp, а 2-й - всего 50dp, угадайте, где находится ваш 3-й предмет, слева или справа?
источник
При использовании CardView для детей проблему с пробелами между элементами можно решить, установив для app: cardUseCompatPadding значение true.
Для большей наценки увеличьте высоту предмета. CardElevation является необязательным (используйте значение по умолчанию).
источник
В итоге я сделал это для моего RecyclerView с GridLayoutManager и HeaderView .
В приведенном ниже коде я установил интервал в 4 dp между каждым элементом (2 dp вокруг каждого отдельного элемента и 2 dp вокруг всего обзора переработчика).
layout.xml
фрагмент / активность
SpaceItemDecoration.java
Utils.java
источник
Для работы https://stackoverflow.com/a/29905000/1649371 (см. Выше) мне пришлось изменить следующие методы (и все последующие вызовы)
источник
Эта ссылка работала для меня во всех ситуациях, вы можете попробовать это.
источник
Если у вас есть тумблер, который переключается между списком и сеткой, не забудьте позвонить
recyclerView.removeItemDecoration()
перед установкой любого нового украшения элемента. Если нет, то новые вычисления для расстояния будут неверными.Что-то вроде этого.
источник
Если вы используете заголовок с GridLayoutManager, используйте этот код, написанный на kotlin, для расстояния между сетками:
И перейти
ItemDecoration
кrecyclerview
какисточник
спасибо Эдвардаа за ответ https://stackoverflow.com/a/30701422/2227031
Еще один момент, на который следует обратить внимание:
если общий интервал и общая itemWidth не равны ширине экрана, вам также необходимо настроить itemWidth, например, на методе onBindViewHolder адаптера
источник
Версия Kotlin, которую я сделал, основанная на великолепном ответе edwardaa
источник