Este é um exemplo de como isso poderia ter sido feito anteriormente na ListView
classe, usando os parâmetros divider e dividerHeight :
<ListView
android:id="@+id/activity_home_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/transparent"
android:dividerHeight="8dp"/>
No entanto, não vejo essa possibilidade na RecyclerView
classe.
<android.support.v7.widget.RecyclerView
android:id="@+id/activity_home_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
Nesse caso, é correto definir margens e / ou adicionar uma exibição personalizada do divisor diretamente no layout de um item da lista ou existe uma maneira melhor de atingir meu objetivo?
android
android-recyclerview
divider
Olhos Claros
fonte
fonte
com.homeretailgroup.argos.android.view.decorators.DividerItemDecoration
e a usa assim:mRecyclerView.addItemDecoration(new DividerItemDecoration(activity, LinearLayoutManager.VERTICAL));
Respostas:
Atualização de outubro de 2016
A versão 25.0.0 da Android Support Library introduziu a
DividerItemDecoration
classe:Uso:
Resposta anterior
Algumas respostas usam métodos que foram descontinuados ou não fornecem uma solução completa, então tentei fazer um resumo curto e atualizado.
Diferentemente
ListView
, aRecyclerView
classe não possui parâmetros relacionados ao divisor. Em vez disso, você precisa estenderItemDecoration
, umRecyclerView
's classe interna:Vertical
espaçamentoItemDecoration
Estenda
ItemDecoration
, adicione construtor personalizado que ocupa espaçoheight
como parâmetro e substitui ogetItemOffsets()
método:Se você não deseja inserir espaço abaixo do último item, adicione a seguinte condição:
Nota: você também pode modificar
outRect.top
,outRect.left
eoutRect.right
propriedades para efeito desejado.Divisor
ItemDecoration
Método de extensão
ItemDecoration
e substituiçãoonDraw()
:Você pode chamar o primeiro construtor que usa os atributos divisores padrão do Android ou o segundo que usa seu próprio drawable, por exemplo drawable / divider.xml
Nota: se você quiser que o divisor seja desenhado sobre seus itens, substitua o
onDrawOver()
método.Uso
Para usar sua nova classe, adicione
VerticalSpaceItemDecoration
ouDividerSpaceItemDecoration
aRecyclerView
, por exemplo, noonCreateView()
método do seu fragmento :Há também a biblioteca de Lucas Rocha, que deveria simplificar o processo de decoração dos itens. Ainda não tentei.
Entre suas características estão:
fonte
onDraw()
. Apenas refiro instâncias já existentes.canvas.drawLine(startX, startY, stopX, stopY, mPaint)
deonDrawOver
? Alguma diferença de desempenho?Basta adicionar
Também pode ser necessário adicionar a dependência
compile 'com.android.support:recyclerview-v7:27.1.0'
EDITAR:
Para personalizá-lo um pouco, você pode adicionar um drawable personalizado:
Você é livre para usar qualquer drawable personalizado, por exemplo:
fonte
Configuration
para o divisor vertical:if (orientation == Configuration.ORIENTATION_LANDSCAPE) { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL)); } else { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));}
Posso direcionar sua atenção para este arquivo específico no Github de Alex Fu: https://gist.github.com/alexfu/0f464fc3742f134ccd1e
É o arquivo de exemplo DividerItemDecoration.java "extraído diretamente das demos de suporte". ( Https://plus.google.com/103498612790395592106/posts/VVEB3m7NkSS )
Consegui obter linhas divisórias muito bem depois de importar esse arquivo no meu projeto e adicioná-lo como uma decoração de item à exibição do reciclador.
Aqui está como meu onCreateView se parece no meu fragmento que contém a Recyclerview:
Tenho certeza de que estilos adicionais podem ser feitos, mas é um ponto de partida. :)
fonte
ItemDecoration
Implementação simples para espaços iguais entre todos os itens.fonte
getChildPosition
agora está obsoleto,getChildAdapterPosition
pode ser usado.super.getItemOffsets
ou suas compensações serão substituídas.getChildLayoutPosition
ser usado?O mais simples é definir a cor de fundo do RecyclerView e a cor de fundo diferente dos itens. Aqui está um exemplo ...
e o item TextView (pode ser qualquer coisa) com margem inferior "x" dp ou px.
A saída ...
fonte
Eu acho que o uso do divisor simples o ajudará
a adicionar o divisor a cada item:
1- Adicione isso ao diretório drawable line_divider.xml
2- Crie a classe SimpleDividerItemDecoration
Eu usei este exemplo para definir esta classe:
https://gist.github.com/polbins/e37206fbc444207c0e92
3- Na atividade ou fragmento que, usando o RecyclerView, dentro do onCreateView, adicione este:
4- Para adicionar espaçamento entre os itens,
basta adicionar propriedades de preenchimento à sua exibição de itens
fonte
Como eu defini
ItemAnimators
. OItemDecorator
não entra ou sai junto com a animação.Acabei tendo uma linha de exibição no meu arquivo de layout de exibição de item de cada item. Isso resolveu meu caso.
DividerItemDecoration
parecia ser muito feitiço para um simples divisor.fonte
Isso é simples, você não precisa de um código tão complicado
Adicione isso no seu drawable: line_divider.xml
fonte
Como ainda não existe uma maneira correta de implementar isso usando o Material Design, fiz o seguinte truque para adicionar um divisor diretamente ao item da lista:
fonte
A maneira como estou lidando com a exibição do divisor e também com os insertos do divisor é adicionando uma extensão RecyclerView.
1
Adicione um novo arquivo de extensão nomeando View ou RecyclerView:
e adicione o
setDivider
método de extensão dentro do arquivo RecyclerViewExtension.kt.2)
Crie um arquivo de recurso Drawable dentro do
drawable
pacote, comorecycler_view_divider.xml
:onde você pode especificar a esquerda e direita margem em
android:insetLeft
eandroid:insetRight
.3)
Na sua Atividade ou Fragmento em que o RecyclerView é inicializado, você pode definir o drawable personalizado chamando:
4)
Saúde 🍺
fonte
Se alguém quiser adicionar, por exemplo, espaçamento de 10dp entre os itens, você poderá fazer isso configurando um drawable para
DividerItemDecoration
:Onde
divider_10dp
está um recurso desenhável que contém:fonte
ATUALIZAÇÃO DE OUTUBRO DE 2016
Com a biblioteca de suporte v25.0.0, finalmente existe uma implementação padrão de divisores horizontais e verticais básicos disponíveis!
https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html
fonte
Na verdade, isso não resolve o problema, mas como solução temporária, você pode definir a propriedade useCompatPadding no cartão em seu layout XML para fazer com que ele seja o mesmo que nas versões anteriores ao Lollipop.
fonte
Para aqueles que procuram apenas espaços entre os itens ,
RecyclerView
veja minha abordagem, onde você obtém espaços iguais entre todos os itens, exceto no primeiro e no último itens em que dei um preenchimento maior. Só aplico preenchimento à esquerda / direita na horizontalLayoutManager
e na parte superior / inferior na verticalLayoutManager
.dimens.xml
fonte
Adicione uma margem à sua visualização, funcionou para mim.
Se você deseja adicionar espaçamento igual e deseja fazê-lo em XML , defina
padding
oRecyclerView
valor igual e iguallayoutMargin
ao item inflado no itemRecyclerView
e deixe a cor de fundo determinar a cor do espaçamento.fonte
overscroll
efeito quando puxando no final da lista terá uma cobertura desnecessária aplicada a ele para quando preenchimento é aplicado aRecyclerView
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" card_view:cardElevation="4dp" <!-- your item's XML here --> </android.support.v7.widget.CardView>
Basta adicionar um plano de fundo ao layout do seu item de reciclador da seguinte maneira
Crie o seguinte shape_border.xml na pasta drawable
Aqui está o resultado final - um RecyclerView com divisor.
fonte
parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1
provavelmente deve serparent.getChildAdapterPosition(view) > 0
comoutRect.bottom = mVerticalSpaceHeight
tornando-seoutRect.top = mVerticalSpaceHeight
que deveria ser a resposta aceita.Bifurquei o DividerItemDecoration a partir de uma essência mais antiga e simplifiquei para caber no meu caso de uso, e também o modifiquei para desenhar os divisores da maneira como são desenhados no ListView, incluindo um divisor após o último item da lista. Isso também manipula animações verticais de ItemAnimator:
1) Adicione esta classe ao seu projeto:
2) Adicione o decorador ao seu RecylerView:
fonte
Em vez de criar um
shape xml
para alterar a altura e a cor do divisor. Você pode criar programaticamente comofonte
Retirado de uma pesquisa no google, adicione este ItemDecoration ao seu
RecyclerView
:fonte
Este link funcionou como um encanto para mim:
https://gist.github.com/lapastillaroja/858caf1a82791b6c1a36
Então em sua atividade:
Ou isso se você estiver usando um fragmento:
fonte
mShowFirstDivider = false
,mShowLastDivider = true
, mas isso não vai funcionar. Alguma idéia do porquê?Podemos decorar os itens usando vários decoradores anexados à visão de reciclagem, como o DividerItemDecoration:
Basta usar o seguinte ... retirado da resposta de EyesClear
} e use o acima, da seguinte maneira
Isso exibirá divisores entre cada item da lista, como mostrado abaixo:
E para aqueles que estão procurando mais detalhes, consulte este guia .
Algumas respostas aqui sugerem o uso de margens, mas o problema é que: se você adicionar as margens superior e inferior, elas aparecerão adicionadas entre os itens e serão muito grandes. Se você adicionar apenas uma delas, não haverá margem na parte superior ou inferior da lista inteira. Se você adicionar metade da distância na parte superior, metade na parte inferior, as margens externas serão muito pequenas.
Portanto, a única solução esteticamente correta é o divisor que o sistema sabe onde aplicar corretamente: entre itens, mas não acima ou abaixo dos itens.
Por favor, deixe-me saber de alguma dúvida nos comentários abaixo :)
fonte
DividerItemDecoration
código.Tarde demais, mas para
GridLayoutManager
eu usar isso:Este trabalho para qualquer contagem de span que você tiver.
Ollie.
fonte
FlexboxLayoutManager
?Você pode adicionar facilmente programaticamente.
Se o seu Gerenciador de layout for Linearlayout, você poderá usar:
fonte
fonte
Sinto que há necessidade de uma resposta simples e baseada em código que não use XML
fonte
Se você deseja adicionar o mesmo espaço para itens, a maneira mais simples é adicionar preenchimento superior + esquerdo ao RecycleView e margens direita + inferior aos itens do cartão.
dimens.xml
list_item.xml
list.xml
fonte
Adicionei uma linha no item da lista como abaixo
1px irá desenhar a linha fina.
fonte
O
RecyclerView
é um pouco diferente doListView
. Na verdade, eleRecyclerView
precisa de umaListView
estrutura semelhante. Por exemplo, aLinearLayout
. OLinearLayout
possui parâmetros para dividir cada elemento. No código abaixo, eu tenho umRecyclerView
composto deCardView
objetos dentro de umLinearLayout
com um "preenchimento" que colocará algum espaço entre os itens. Faça esse espaço muito pequeno e você terá uma linha.Aqui está a visualização Recycler em recyclerview_layout.xml
E aqui está a aparência de cada item (e mostra como dividido devido ao andróide: preenchimento no LinearLayout que envolve tudo.) Em outro arquivo: cards_layout.xml
fonte
Uma solução realmente fácil é usar o RecyclerView-FlexibleDivider
Adicionar dependência:
Adicione à sua reciclagem:
E pronto!
fonte
1.One of the Way é usando o cardview e o reciclador juntos , podemos adicionar facilmente efeitos como divisores. ex. https://developer.android.com/training/material/lists-cards.html
2.e outra é adicionando a visualização como divisor ao list_item_layout da visualização do reciclador .
fonte
Isso adicionará espaço na parte superior e inferior de cada item (ou esquerda e direita). Em seguida, você pode configurá-lo para o seu
recyclerView
.SizeUtils.java
fonte