Como você define o espaçamento das colunas com um RecyclerView usando um GridLayoutManager? Definir a margem / preenchimento dentro do meu layout não tem efeito.
251
Como você define o espaçamento das colunas com um RecyclerView usando um GridLayoutManager? Definir a margem / preenchimento dentro do meu layout não tem efeito.
GridLayoutManager
e substituirgenerateDefaultLayoutParams()
e parentes?Respostas:
O RecyclerViews suporta o conceito de ItemDecoration : compensações especiais e desenhos em torno de cada elemento. Como visto nesta resposta , você pode usar
Em seguida, adicione-o via
fonte
RecyclerView
(e usaclipToPadding="false"
), pode reestruturar as coisas um pouco. Caso contrário, basta mover a verificação if para a última vez (pois você ainda deseja o preenchimento inferior no último item).GridLayoutManager
. A resposta não funcionará em layouts de várias colunas / linhasO código a seguir funciona bem e cada coluna tem a mesma largura:
Uso
1. sem margem
2. com borda
fonte
A seguir, é apresentada a solução simples passo a passo, se você deseja o espaçamento igual entre itens e tamanhos iguais.
ItemOffsetDecoration
Implementação
No seu código-fonte, adicione
ItemOffsetDecoration
ao seuRecyclerView.
valor de deslocamento do item deve ter metade do tamanho do valor real que você deseja adicionar como espaço entre os itens.Além disso, defina o valor do deslocamento do item como preenchimento para ele
RecyclerView
e especifiqueandroid:clipToPadding=false
.fonte
Tente isso. Ele cuidará de espaçamento igual ao redor. Funciona com Lista, Grade e StaggeredGrid.
Editado
O código atualizado deve lidar com a maioria dos casos de canto com extensões, orientação etc. Observe que, se estiver usando setSpanSizeLookup () com GridLayoutManager, a configuração de setSpanIndexCacheEnabled () é recomendada por motivos de desempenho.
Observe que parece que, com o StaggeredGrid, parece haver um erro no qual o índice das crianças fica maluco e difícil de rastrear, portanto o código abaixo pode não funcionar muito bem com o StaggeredGridLayoutManager.
Espero que ajude.
fonte
O código a seguir manipulará StaggeredGridLayoutManager, GridLayoutManager e LinearLayoutManager.
Então use
fonte
SpaceItemDecoration
verdade, ele adiciona o preenchimento ao pai (a visualização do reciclador).halfSpace
estofamento apareceu (para o lado direito) em que não tinha fixado o estofo para o pais em XMLAqui está uma solução que não requer "spanCount" (número de colunas) que eu a uso porque uso GridAutofitLayoutManager (calcula o número de colunas de acordo com o tamanho de célula necessário)
( lembre-se de que isso funcionará apenas no GridLayoutManager )
Aqui está o GridAutofitLayoutManager, se alguém estiver interessado:
Finalmente:
fonte
layoutManager.getPosition(view)
depois dessa verificação, se a posição é zero e será o seu cabeçalho. Além disso, dessa forma, você poderá adicionar outro cabeçalho em qualquer posição que desejar :)Existe apenas uma solução fácil, que você pode lembrar e implementar sempre que necessário. Sem bugs, sem cálculos malucos. Coloque margem no layout do cartão / item e coloque o mesmo tamanho do preenchimento no RecyclerView:
item_layout.xml
activity_layout.xml
ATUALIZAR:
fonte
Se você deseja corrigir o tamanho do seu
RecyclerView
item em todos os dispositivos. Você pode fazer assimrecyclerview_item.xml
dimens.xml
Atividade
fonte
A resposta selecionada é quase perfeita, mas, dependendo do espaço, a largura dos itens não pode ser igual. (No meu caso, foi crítico). Acabei com este código que aumenta um pouco o espaço, para que os itens tenham a mesma largura.
fonte
columnCount == 1 -> { outRect.left = space outRect.right = space }
O @edwardaa copiou o código fornecido e eu o aperfeiçoo para suportar RTL:
fonte
As respostas acima esclareceram maneiras de definir o tratamento de margens GridLayoutManager e LinearLayoutManager.
Mas para StaggeredGridLayoutManager, a resposta de Pirdad Sakhizada diz: "Pode não funcionar muito bem com StaggeredGridLayoutManager". Esse deve ser o problema sobre o IndexOfSpan.
Você pode obtê-lo desta maneira:
fonte
Um pouco diferente da resposta de edwardaa, a diferença é como a coluna é determinada, porque em casos como itens com várias alturas, a coluna não pode ser determinada simplesmente%
spanCount
fonte
fonte
Aqui está minha modificação,
SpacesItemDecoration
que pode ocupar numOfColums e espaço igualmente na parte superior, inferior, esquerda e direita .e use o código abaixo em sua lógica.
fonte
Existe uma solução muito simples e flexível para esse problema usando apenas XML que funciona em todos os LayoutManager.
Suponha que você queira um espaçamento igual de X (8dp por exemplo).
Enrole o item do CardView em outro layout
Dê ao Layout externo um preenchimento de X / 2 (4dp)
Tornar transparente o plano de fundo do layout externo
...
...
e é isso. Você tem um espaçamento perfeito de X (8dp).
fonte
Para aqueles que têm problemas com o staggeredLayoutManager (como https://imgur.com/XVutH5u )
métodos do recyclerView:
às vezes, retorna -1 como índice, para que possamos enfrentar problemas ao definir itemDecor. Minha solução é substituir o método de ItemDecoration descontinuado:
em vez do novato:
como isso:
Parece funcionar para mim até agora :)
fonte
As respostas para esta pergunta parecem mais complexas do que deveriam ser. Aqui está a minha opinião sobre isso.
Digamos que você queira um espaçamento de 1dp entre os itens da grade. Faça o seguinte:
fonte
Isso funcionará também
RecyclerView
com o cabeçalho.fonte
A resposta de yqritc funcionou perfeitamente para mim. Eu estava usando o Kotlin no entanto, então aqui é o equivalente a isso.
tudo o resto é o mesmo.
fonte
Para usuários do StaggeredGridLayoutManager , tenha cuidado, muitas respostas aqui, incluindo a mais votada, calculam a coluna do item com o código abaixo:
que pressupõe que os itens 1/3/5 / .. estão sempre localizados no lado esquerdo e 2/4/6 / /. sempre estão localizados no lado direito. Essa suposição é sempre verdadeira? Não.
Digamos que o seu primeiro item tenha 100dp de altura e o segundo apenas 50dp, adivinhe onde está o seu terceiro item, à esquerda ou à direita?
fonte
Acabei fazendo isso assim no meu RecyclerView com GridLayoutManager e HeaderView .
No código abaixo, defino um espaço de 4dp entre cada item (2dp em torno de cada item e 2dp preenchimento em toda a reciclagem).
layout.xml
fragmento / atividade
SpaceItemDecoration.java
Utils.java
fonte
Para que a solução https://stackoverflow.com/a/29905000/1649371 (acima) funcionasse, eu tive que modificar os seguintes métodos (e todas as chamadas subseqüentes)
fonte
Este link funcionou para mim em todas as situações em que você pode tentar isso.
fonte
Se você tiver uma chave de alternância que alterna entre lista e grade, não se esqueça de ligar
recyclerView.removeItemDecoration()
antes de definir qualquer nova decoração de item. Caso contrário, os novos cálculos para o espaçamento seriam incorretos.Algo assim.
fonte
Se você estiver usando o Cabeçalho com GridLayoutManager, use este código escrito no kotlin para espaçar as grades:
E passar
ItemDecoration
pararecyclerview
comofonte
Ao usar o CardView for child, o problema com espaços entre os itens pode ser resolvido configurando app: cardUseCompatPadding como true.
Para margens maiores, aumente a elevação do item. CardElevation é opcional (use o valor padrão).
fonte
obrigado resposta de edwardaa https://stackoverflow.com/a/30701422/2227031
Outro ponto a ser observado é que:
se o espaçamento total e o itemWidth total não forem iguais à largura da tela, você também precisará ajustar o itemWidth, por exemplo, no método onBindViewHolder do adaptador
fonte
Uma versão do Kotlin que fiz com base na grande resposta de edwardaa
fonte