Como adicionar divisores e espaços entre itens no RecyclerView?

938

Este é um exemplo de como isso poderia ter sido feito anteriormente na ListViewclasse, 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 RecyclerViewclasse.

<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?

Olhos Claros
fonte
Isso me ajudou: stackoverflow.com/questions/26892296/…
Jared Burrows
@EyesClear Adicione itens <TextView /> outro xml e use-o na lista Mesma atividade.
Amitsharma 04/04
7
Existe uma classe em support lib com.homeretailgroup.argos.android.view.decorators.DividerItemDecoratione a usa assim:mRecyclerView.addItemDecoration(new DividerItemDecoration(activity, LinearLayoutManager.VERTICAL));
fada21
Você pode adicionar margem inferior ao seu item de lista para listas verticais e talvez ele possa ser usado como divisor?
precisa saber é
A maneira mais simples é adicionar margens superior / inferior ao redor do primeiro item na linha do adaptador. android: layout_marginBottom = "4dp". (Nota acrescentando as margens para o layout pai não vai cortá-la.)
pstorli

Respostas:

1227

Atualização de outubro de 2016

A versão 25.0.0 da Android Support Library introduziu a DividerItemDecorationclasse:

DividerItemDecoration é um RecyclerView.ItemDecoration que pode ser usado como um divisor entre itens de a LinearLayoutManager. Ele suporta tanto HORIZONTALe VERTICALorientações.

Uso:

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
    layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);

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, a RecyclerViewclasse não possui parâmetros relacionados ao divisor. Em vez disso, você precisa estender ItemDecoration, um RecyclerView's classe interna:

An ItemDecorationpermite que o aplicativo inclua um desenho e deslocamento de layout especiais nas visualizações de itens específicos do conjunto de dados do adaptador. Isso pode ser útil para desenhar divisórias entre itens, destaques, limites de agrupamento visual e muito mais.

Todos ItemDecorationssão desenhados na ordem em que foram adicionados, antes de os pontos de vista de itens (em onDraw()) e depois os itens (em onDrawOver ( Canvas, RecyclerView, RecyclerView.State).

Vertical espaçamento ItemDecoration

Estenda ItemDecoration, adicione construtor personalizado que ocupa espaço heightcomo parâmetro e substitui o getItemOffsets()método:

public class VerticalSpaceItemDecoration extends RecyclerView.ItemDecoration {

    private final int verticalSpaceHeight;

    public VerticalSpaceItemDecoration(int verticalSpaceHeight) {
        this.verticalSpaceHeight = verticalSpaceHeight;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
            RecyclerView.State state) {
        outRect.bottom = verticalSpaceHeight;
    }
}

Se você não deseja inserir espaço abaixo do último item, adicione a seguinte condição:

if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
            outRect.bottom = verticalSpaceHeight;
}

Nota: você também pode modificar outRect.top, outRect.lefte outRect.rightpropriedades para efeito desejado.

Divisor ItemDecoration

Método de extensão ItemDecoratione substituição onDraw():

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

    private Drawable divider;

    /**
     * Default divider will be used
     */
    public DividerItemDecoration(Context context) {
        final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
        divider = styledAttributes.getDrawable(0);
        styledAttributes.recycle();
    }

    /**
     * Custom divider will be used
     */
    public DividerItemDecoration(Context context, int resId) {
        divider = ContextCompat.getDrawable(context, resId);
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();

        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);

            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

            int top = child.getBottom() + params.bottomMargin;
            int bottom = top + divider.getIntrinsicHeight();

            divider.setBounds(left, top, right, bottom);
            divider.draw(c);
        }
    }
}

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

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <size android:height="1dp" />
    <solid android:color="#ff992900" />
</shape>

Nota: se você quiser que o divisor seja desenhado sobre seus itens, substitua o onDrawOver()método.

Uso

Para usar sua nova classe, adicione VerticalSpaceItemDecorationou DividerSpaceItemDecorationa RecyclerView, por exemplo, no onCreateView()método do seu fragmento :

private static final int VERTICAL_ITEM_SPACE = 48;
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_feed, container, false);

    recyclerView = (RecyclerView) rootView.findViewById(R.id.fragment_home_recycler_view);
    linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);

    //add ItemDecoration
    recyclerView.addItemDecoration(new VerticalSpaceItemDecoration(VERTICAL_ITEM_SPACE));
    //or
    recyclerView.addItemDecoration(new DividerItemDecoration(getActivity()));
    //or
    recyclerView.addItemDecoration(
            new DividerItemDecoration(getActivity(), R.drawable.divider));

    recyclerView.setAdapter(...);

    return rootView;
}

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:

  • Uma coleção de decorações de itens de estoque, incluindo:
  • Espaçamento entre itens Divisores horizontais / verticais.
  • Item da lista
Olhos Claros
fonte
3
@droppin_science Corrija-me se estiver errado, mas não crio nenhum objeto onDraw(). Apenas refiro instâncias já existentes.
EyesClear
1
Gostaria de saber se é uma boa idéia usar o Paint em vez de criar um drawable? Então eu posso chamar canvas.drawLine(startX, startY, stopX, stopY, mPaint)de onDrawOver? Alguma diferença de desempenho?
Arst
1
Apenas um comentário informativo: sempre inclua o espaço no último item se você planeja adicionar itens mais tarde na lista. Se você não fizer isso, ao adicionar um item, ele não terá espaço. Obrigado pelo VerticalSpace!
Tsuharesu 14/10/2015
24
DividerItemDecoration, como mostrado acima, não funcionará se os itens estiverem totalmente opacos, os divisores serão superados pelos itens. Nesse caso, você também precisa substituir o getItemOffsets () e adicionar o deslocamento inferior ao outRect para que o divisor acabe fora do item. Como alternativa, você pode substituir onDrawOver () em vez de onDraw () para desenhar o divisor após o item.
jpop
115
Uma página inteira de código para adicionar o divisor ao recyclerView é a melhor resposta. Que vergonha, google.
Cuidado # j7
480

Basta adicionar

recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),
                DividerItemDecoration.VERTICAL));

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:

DividerItemDecoration itemDecorator = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL);
itemDecorator.setDrawable(ContextCompat.getDrawable(getContext(), R.drawable.divider));

Você é livre para usar qualquer drawable personalizado, por exemplo:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="@color/colorPrimary"/>
    <size android:height="0.5dp"/>
</shape>
Leo Droidcoder
fonte
Atividade não é necessária. Contexto é suficiente
mac229
Essa deve ser a resposta correta. Por favor, altere getActivity Para apenas o contexto.
Jhon Fredy Trujillo Ortega
Também é melhor obter orientação do seu LayoutManager.
Lsrom 23/04/19
Obrigado! Também você pode usar Configurationpara o divisor vertical:if (orientation == Configuration.ORIENTATION_LANDSCAPE) { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL)); } else { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));}
AlexS
3
Boa resposta, mas adiciona um divisor também após o último item.
CoolMind
256

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:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_recycler_view, container, false);

    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);
    mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(getActivity());
    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());

    return rootView;
}

Tenho certeza de que estilos adicionais podem ser feitos, mas é um ponto de partida. :)

Duy Nguyen
fonte
Como você adiciona substitui: "footerDividersEnabled", "headerDividersEnabled", "listSelector", "fastScrollEnabled", "smoothScrollbar", "textFilterEnabled"?
desenvolvedor android
Quaisquer entradas sobre como colocar Styling?
N
para estilizar esta solução, você precisa substituir o atributo "android: listDivider" no seu tema
Pavel Dudka
1
O divisor não funciona com o RecyclerView. Você precisa usar RecyclerView.itemDecoration. Veja esta resposta: stackoverflow.com/a/27664023/2311451
Cocorico
3
por que o divisor expande toda a largura do item? como exibir como nas especificações google.com/design/spec/components/lists.html#lists-specs
chip
156

ItemDecorationImplementação simples para espaços iguais entre todos os itens.

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
    private int space;

    public SpacesItemDecoration(int space) {
        this.space = space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.left = space;
        outRect.right = space;
        outRect.bottom = space;

        // Add top margin only for the first item to avoid double space between items
        if(parent.getChildAdapterPosition(view) == 0) {
            outRect.top = space;
        }
    }
}
SergeyA
fonte
Estou recebendo o espaço, mas como faço para obter um divisor
Pankaj Nimgade
26
getChildPositionagora está obsoleto, getChildAdapterPositionpode ser usado.
EyesClear
4
Não se esqueça (como eu fiz) de remover a chamada super.getItemOffsetsou suas compensações serão substituídas.
jayeffkay
@EyesClear não deve getChildLayoutPositionser usado?
precisa
3
isso implementa o espaçamento em pixels?
filthy_wizard
108

O mais simples é definir a cor de fundo do RecyclerView e a cor de fundo diferente dos itens. Aqui está um exemplo ...

<android.support.v7.widget.RecyclerView
    android:background="#ECEFF1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"/>

e o item TextView (pode ser qualquer coisa) com margem inferior "x" dp ou px.

<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="1dp"
    android:background="#FFFFFF"/>

A saída ...

insira a descrição da imagem aqui

Madan Sapkota
fonte
2
Que truque! só precisa manter a lista branca durante o carregamento.
Hamzeh Soboh
36
Cuidado com overdraw!
22416 shem
@shem você poderia elaborar?
RominaV
7
Ao desenhar no Android duas camadas uma acima da outra (o plano de fundo da atividade, o plano de exibição da reciclagem e o plano de exibição do item) - o Android desenha todas, também as que não são visíveis para os usuários. Que chamou overdraw e pode afetar o seu desempenho, mais sobre ele aqui: youtube.com/watch?v=T52v50r-JfE
shem
41

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

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
    android:width="1dp"
    android:height="1dp" />
<solid android:color="#999999" />
</shape>

2- Crie a classe SimpleDividerItemDecoration
Eu usei este exemplo para definir esta classe:
https://gist.github.com/polbins/e37206fbc444207c0e92

package com.example.myapp;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.example.myapp.R;

public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration{
private Drawable mDivider;

public SimpleDividerItemDecoration(Resources resources) {
    mDivider = resources.getDrawable(R.drawable.line_divider);
}

public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    int left = parent.getPaddingLeft();
    int right = parent.getWidth() - parent.getPaddingRight();

    int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        View child = parent.getChildAt(i);

        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

        int top = child.getBottom() + params.bottomMargin;
        int bottom = top + mDivider.getIntrinsicHeight();

        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }
  }
}


3- Na atividade ou fragmento que, usando o RecyclerView, dentro do onCreateView, adicione este:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
 RecyclerView myRecyclerView = (RecyclerView) layout.findViewById(R.id.my_recycler_view);
 myRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(getResources()));
 ....
 }


4- Para adicionar espaçamento entre os itens,
basta adicionar propriedades de preenchimento à sua exibição de itens

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:padding="4dp"
>
..... item structure
</RelativeLayout>
Belal mazlom
fonte
Como faço para que o GridLayoutManager funcione, para mostrar também divisores verticais entre as células?
desenvolvedor android
2
resources.getDrawable () agora está obsoleto. Você pode passar no contexto e uso ContextCompat.getDrawable (contexto, R.drawable.line_divider)
Eric B.
36

Como eu defini ItemAnimators. O ItemDecoratornã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. DividerItemDecorationparecia ser muito feitiço para um simples divisor.

<View
    android:layout_width="match_parent"
    android:layout_height="1px"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:background="@color/lt_gray"/>
Javanator
fonte
Você está certo. Animações não funcionam com o ItemDecoration. Não sei por que, mas sem eu especificar nada, recebo animações e acho muito perturbador e feio que as linhas criadas por ItemDecoration não sigam. Então, eu vou usar uma solução como a sua.
Michel
Como você lidou com o último item?
oldergod
@oldergod. Você apontou o ponto certo da dor. Primeiro, eu concordaria que um projeto também tivesse divisor no último item. Mas se você não quer isso. atribua um ID a esta visualização e oculte no bindView se a posição for a última.
Javanator 15/09/16
@ Javanator vejo ok, a mesma abordagem que eu tomei. obrigado.
oldergod
o mais simples é o melhor
hyyou2010
27

Isso é simples, você não precisa de um código tão complicado

DividerItemDecoration divider = new 
DividerItemDecoration(mRVMovieReview.getContext(), 
DividerItemDecoration.VERTICAL);
divider.setDrawable(
    ContextCompat.getDrawable(getBaseContext(), R.drawable.line_divider)
);
mRVMovieReview.addItemDecoration(divider);

Adicione isso no seu drawable: line_divider.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
  android:shape="rectangle">
    <size android:height="1dp" />
    <solid android:color="@android:color/black" />
</shape>
Faheem
fonte
21

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:

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dividerColor"/>
Yoann Hercouet
fonte
O DividerItemDecoration para de funcionar depois de obter algumas informações de elevação do design do material (para obter o mesmo efeito da Caixa de entrada); ficou muito complicado para uma coisa simples. Esta solução é simples e funciona.
DenisGL
21

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:

RecyclerViewExtension.kt

e adicione o setDividermétodo de extensão dentro do arquivo RecyclerViewExtension.kt.

/*
* RecyclerViewExtension.kt
* */
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.RecyclerView


fun RecyclerView.setDivider(@DrawableRes drawableRes: Int) {
    val divider = DividerItemDecoration(
        this.context,
        DividerItemDecoration.VERTICAL
    )
    val drawable = ContextCompat.getDrawable(
        this.context,
        drawableRes
    )
    drawable?.let {
        divider.setDrawable(it)
        addItemDecoration(divider)
    }
}

2)

Crie um arquivo de recurso Drawable dentro do drawablepacote, como recycler_view_divider.xml:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="10dp"
    android:insetRight="10dp">

    <shape>
        <size android:height="0.5dp" />
        <solid android:color="@android:color/darker_gray" />
    </shape>

</inset>

onde você pode especificar a esquerda e direita margem em android:insetLefteandroid:insetRight .

3)

Na sua Atividade ou Fragmento em que o RecyclerView é inicializado, você pode definir o drawable personalizado chamando:

recyclerView.setDivider(R.drawable.recycler_view_divider)

4)

Saúde 🍺

Linha RecyclerView com divisor.

Gent Berani
fonte
16

Se alguém quiser adicionar, por exemplo, espaçamento de 10dp entre os itens, você poderá fazer isso configurando um drawable para DividerItemDecoration:

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(
    recyclerView.getContext(),
    layoutManager.getOrientation()
);

dividerItemDecoration.setDrawable(
    ContextCompat.getDrawable(getContext(), R.drawable.divider_10dp)
); 

Onde divider_10dpestá um recurso desenhável que contém:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <size android:height="10dp"/>
    <solid android:color="@android:color/transparent"/>
</shape>
Praveen Singh
fonte
11

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.

card_view:cardUseCompatPadding="true"
Kevin Grant
fonte
Você está em
Superdownloads
11

Para aqueles que procuram apenas espaços entre os itens , RecyclerViewveja 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 horizontal LayoutManagere na parte superior / inferior na vertical LayoutManager.

public class PaddingItemDecoration extends RecyclerView.ItemDecoration {

    private int mPaddingPx;
    private int mPaddingEdgesPx;

    public PaddingItemDecoration(Activity activity) {
        final Resources resources = activity.getResources();
        mPaddingPx = (int) resources.getDimension(R.dimen.paddingItemDecorationDefault);
        mPaddingEdgesPx = (int) resources.getDimension(R.dimen.paddingItemDecorationEdge);
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        final int itemPosition = parent.getChildAdapterPosition(view);
        if (itemPosition == RecyclerView.NO_POSITION) {
            return;
        }
        int orientation = getOrientation(parent);
        final int itemCount = state.getItemCount();

        int left = 0;
        int top = 0;
        int right = 0;
        int bottom = 0;

        /** HORIZONTAL */
        if (orientation == LinearLayoutManager.HORIZONTAL) {
            /** all positions */
            left = mPaddingPx;
            right = mPaddingPx;

            /** first position */
            if (itemPosition == 0) {
                left += mPaddingEdgesPx;
            }
            /** last position */
            else if (itemCount > 0 && itemPosition == itemCount - 1) {
                right += mPaddingEdgesPx;
            }
        }
        /** VERTICAL */
        else {
            /** all positions */
            top = mPaddingPx;
            bottom = mPaddingPx;

            /** first position */
            if (itemPosition == 0) {
                top += mPaddingEdgesPx;
            }
            /** last position */
            else if (itemCount > 0 && itemPosition == itemCount - 1) {
                bottom += mPaddingEdgesPx;
            }
        }

        if (!isReverseLayout(parent)) {
            outRect.set(left, top, right, bottom);
        } else {
            outRect.set(right, bottom, left, top);
        }
    }

    private boolean isReverseLayout(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getReverseLayout();
        } else {
            throw new IllegalStateException("PaddingItemDecoration can only be used with a LinearLayoutManager.");
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getOrientation();
        } else {
            throw new IllegalStateException("PaddingItemDecoration can only be used with a LinearLayoutManager.");
        }
    }
}

dimens.xml

<resources>
    <dimen name="paddingItemDecorationDefault">10dp</dimen>
    <dimen name="paddingItemDecorationEdge">20dp</dimen>
</resources>
Ryan Amaral
fonte
11

Adicione uma margem à sua visualização, funcionou para mim.

android:layout_marginTop="10dp"

Se você deseja adicionar espaçamento igual e deseja fazê-lo em XML , defina paddingo RecyclerViewvalor igual e igual layoutMarginao item inflado no item RecyclerViewe deixe a cor de fundo determinar a cor do espaçamento.

Quantum Mattter
fonte
3
Embora isso funcione, essa não é a resposta correta, por exemplo, porque isso não resolve o problema sem fazer coisas extras no layout da linha, também, na parte superior a margem x1 aparecerá, entre as linhas a margem x2 aparecerá.
Sreekanth Karumanaghat
Esta não é uma boa idéia, porque o overscrollefeito quando puxando no final da lista terá uma cobertura desnecessária aplicada a ele para quando preenchimento é aplicado aRecyclerView
AeroEchelon
É melhor para embrulhar o layout do item em uma Biblioteca Suporte CardView assim você pode controlar outros atributos por exemplo elevação / sombra, etc: <?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>
kip2
11
  • Aqui é simples hack para adicionar divisor
  • Basta adicionar um plano de fundo ao layout do seu item de reciclador da seguinte maneira

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shape_border"
        android:gravity="center"
        android:orientation="horizontal"
        android:padding="5dp">
    
    <ImageView
        android:id="@+id/imageViewContactLogo"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_marginRight="10dp"
        android:src="@drawable/ic_user" />
    
    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.92"
        android:gravity="center|start"
        android:orientation="vertical">
    
    <TextView
        android:id="@+id/textViewContactName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    
    <TextView
        android:id="@+id/textViewStatusOrNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:singleLine="true"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>
    
    <TextView
        android:id="@+id/textViewUnreadCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:padding="5dp"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/red"
        android:textSize="22sp" />
    
    <Button
        android:id="@+id/buttonInvite"
        android:layout_width="54dp"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_add_friend" />
    </LinearLayout>

Crie o seguinte shape_border.xml na pasta drawable

  <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
      android:shape="rectangle" >
       <gradient
        android:angle="270"
        android:centerColor="@android:color/transparent"
        android:centerX="0.01"
        android:startColor="#000" />
    </shape>

Aqui está o resultado final - um RecyclerView com divisor.

Aqui está o resultado final - um RecyclerView com divisor.

turbandroid
fonte
1
Esta não é uma abordagem preferida. Embora @EyesClear resposta iniciados int de na onDraw e parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1provavelmente deve ser parent.getChildAdapterPosition(view) > 0com outRect.bottom = mVerticalSpaceHeighttornando-se outRect.top = mVerticalSpaceHeightque deveria ser a resposta aceita.
Droppin_science
@droppin_science - Você não pode negligenciá-lo dizendo apenas que essa não é uma abordagem preferida; ela me fornece resultados precisos conforme o esperado. Também olho a resposta do EyesClear, mas essa resposta é muito complicada para um divisor simples, no entanto, se houver necessidade de faça alguma decoração extra com o item, então essa pode ser a resposta aceita.
turbandroid
Para os eleitores que estão fora do jogo, essa resposta foi dada no momento em que não havia aulas oficiais para o DividerItemDecoration; portanto, basta comparar o intervalo de tempo entre essa resposta e a resposta dada pelo Leo Droidcoder. :)
turbandroid
9

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:

public class DividerItemDecoration extends RecyclerView.ItemDecoration {
    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
    private Drawable divider;

    public DividerItemDecoration(Context context) {
        try {
            final TypedArray a = context.obtainStyledAttributes(ATTRS);
            divider = a.getDrawable(0);
            a.recycle();
        } catch (Resources.NotFoundException e) {
            // TODO Log or handle as necessary.
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        if (divider == null) return;
        if (parent.getChildAdapterPosition(view) < 1) return;

        if (getOrientation(parent) == LinearLayoutManager.VERTICAL)
            outRect.top = divider.getIntrinsicHeight();
        else
            throw new IllegalArgumentException("Only usable with vertical lists");
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if (divider == null) {
            super.onDrawOver(c, parent, state);
            return;
        }

        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();
        final int childCount = parent.getChildCount();

        for (int i = 0; i < childCount; ++i) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            final int size = divider.getIntrinsicHeight();
            final int top = (int) (child.getTop() - params.topMargin - size + child.getTranslationY());
            final int bottom = top + size;
            divider.setBounds(left, top, right, bottom);
            divider.draw(c);

            if (i == childCount - 1) {
                final int newTop = (int) (child.getBottom() + params.bottomMargin + child.getTranslationY());
                final int newBottom = newTop + size;
                divider.setBounds(left, newTop, right, newBottom);
                divider.draw(c);
            }
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (!(parent.getLayoutManager() instanceof LinearLayoutManager))
            throw new IllegalStateException("Layout manager must be an instance of LinearLayoutManager");
        return ((LinearLayoutManager) parent.getLayoutManager()).getOrientation();
    }
}

2) Adicione o decorador ao seu RecylerView:

recyclerView.addItemDecoration(new DividerItemDecoration(getActivity()));
Learn OpenGL ES
fonte
Correto, ele é destinado a um LinearLayoutManager. Você pode ter a ideia por trás dela para adaptá-la a um GridLayoutManager.
Aprenda OpenGL ES
8

Em vez de criar um shape xmlpara alterar a altura e a cor do divisor. Você pode criar programaticamente como

val divider = DividerItemDecoration(context,
        DividerItemDecoration.VERTICAL)

divider.setDrawable(ShapeDrawable().apply {
    intrinsicHeight = resources.getDimensionPixelOffset(R.dimen.dp_15)
    paint.color = Color.RED // note: currently (support version 28.0.0), we can not use tranparent color here, if we use transparent, we still see a small divider line. So if we want to display transparent space, we can set color = background color or we can create a custom ItemDecoration instead of DividerItemDecoration. 
})

recycler_devices.addItemDecoration(divider)
Phan Van Linh
fonte
isto é útil resposta
Taha
7

Retirado de uma pesquisa no google, adicione este ItemDecoration ao seu RecyclerView:

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

private Drawable mDivider;
private boolean mShowFirstDivider = false;
private boolean mShowLastDivider = false;


public DividerItemDecoration(Context context, AttributeSet attrs) {
    final TypedArray a = context
            .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider});
    mDivider = a.getDrawable(0);
    a.recycle();
}

public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider,
        boolean showLastDivider) {
    this(context, attrs);
    mShowFirstDivider = showFirstDivider;
    mShowLastDivider = showLastDivider;
}

public DividerItemDecoration(Drawable divider) {
    mDivider = divider;
}

public DividerItemDecoration(Drawable divider, boolean showFirstDivider,
        boolean showLastDivider) {
    this(divider);
    mShowFirstDivider = showFirstDivider;
    mShowLastDivider = showLastDivider;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
        RecyclerView.State state) {
    super.getItemOffsets(outRect, view, parent, state);
    if (mDivider == null) {
        return;
    }
    if (parent.getChildPosition(view) < 1) {
        return;
    }

    if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
        outRect.top = mDivider.getIntrinsicHeight();
    } else {
        outRect.left = mDivider.getIntrinsicWidth();
    }
}

@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    if (mDivider == null) {
        super.onDrawOver(c, parent, state);
        return;
    }

    // Initialization needed to avoid compiler warning
    int left = 0, right = 0, top = 0, bottom = 0, size;
    int orientation = getOrientation(parent);
    int childCount = parent.getChildCount();

    if (orientation == LinearLayoutManager.VERTICAL) {
        size = mDivider.getIntrinsicHeight();
        left = parent.getPaddingLeft();
        right = parent.getWidth() - parent.getPaddingRight();
    } else { //horizontal
        size = mDivider.getIntrinsicWidth();
        top = parent.getPaddingTop();
        bottom = parent.getHeight() - parent.getPaddingBottom();
    }

    for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) {
        View child = parent.getChildAt(i);
        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

        if (orientation == LinearLayoutManager.VERTICAL) {
            top = child.getTop() - params.topMargin;
            bottom = top + size;
        } else { //horizontal
            left = child.getLeft() - params.leftMargin;
            right = left + size;
        }
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }

    // show last divider
    if (mShowLastDivider && childCount > 0) {
        View child = parent.getChildAt(childCount - 1);
        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
        if (orientation == LinearLayoutManager.VERTICAL) {
            top = child.getBottom() + params.bottomMargin;
            bottom = top + size;
        } else { // horizontal
            left = child.getRight() + params.rightMargin;
            right = left + size;
        }
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }
}

private int getOrientation(RecyclerView parent) {
    if (parent.getLayoutManager() instanceof LinearLayoutManager) {
        LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
        return layoutManager.getOrientation();
    } else {
        throw new IllegalStateException(
                "DividerItemDecoration can only be used with a LinearLayoutManager.");
    }
}
}
gatlingxyz
fonte
Isso funciona bem apenas para LinearLayoutManager. O que deve ser feito para GridLayoutManager?
desenvolvedor android
6

Este link funcionou como um encanto para mim:

https://gist.github.com/lapastillaroja/858caf1a82791b6c1a36

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private Drawable mDivider;
    private boolean mShowFirstDivider = false;
    private boolean mShowLastDivider = false;


    public DividerItemDecoration(Context context, AttributeSet attrs) {
        final TypedArray a = context
                .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider});
        mDivider = a.getDrawable(0);
        a.recycle();
    }

    public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider,
            boolean showLastDivider) {
        this(context, attrs);
        mShowFirstDivider = showFirstDivider;
        mShowLastDivider = showLastDivider;
    }

    public DividerItemDecoration(Drawable divider) {
        mDivider = divider;
    }

    public DividerItemDecoration(Drawable divider, boolean showFirstDivider,
            boolean showLastDivider) {
        this(divider);
        mShowFirstDivider = showFirstDivider;
        mShowLastDivider = showLastDivider;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
            RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        if (mDivider == null) {
            return;
        }
        if (parent.getChildPosition(view) < 1) {
            return;
        }

        if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
            outRect.top = mDivider.getIntrinsicHeight();
        } else {
            outRect.left = mDivider.getIntrinsicWidth();
        }
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if (mDivider == null) {
            super.onDrawOver(c, parent, state);
            return;
        }

        // Initialization needed to avoid compiler warning
        int left = 0, right = 0, top = 0, bottom = 0, size;
        int orientation = getOrientation(parent);
        int childCount = parent.getChildCount();

        if (orientation == LinearLayoutManager.VERTICAL) {
            size = mDivider.getIntrinsicHeight();
            left = parent.getPaddingLeft();
            right = parent.getWidth() - parent.getPaddingRight();
        } else { //horizontal
            size = mDivider.getIntrinsicWidth();
            top = parent.getPaddingTop();
            bottom = parent.getHeight() - parent.getPaddingBottom();
        }

        for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) {
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

            if (orientation == LinearLayoutManager.VERTICAL) {
                top = child.getTop() - params.topMargin;
                bottom = top + size;
            } else { //horizontal
                left = child.getLeft() - params.leftMargin;
                right = left + size;
            }
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }

        // show last divider
        if (mShowLastDivider && childCount > 0) {
            View child = parent.getChildAt(childCount - 1);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            if (orientation == LinearLayoutManager.VERTICAL) {
                top = child.getBottom() + params.bottomMargin;
                bottom = top + size;
            } else { // horizontal
                left = child.getRight() + params.rightMargin;
                right = left + size;
            }
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getOrientation();
        } else {
            throw new IllegalStateException(
                    "DividerItemDecoration can only be used with a LinearLayoutManager.");
        }
    }
}

Então em sua atividade:

mCategoryRecyclerView.addItemDecoration(
    new DividerItemDecoration(this, null));

Ou isso se você estiver usando um fragmento:

mCategoryRecyclerView.addItemDecoration(
    new DividerItemDecoration(getActivity(), null));
Micro
fonte
1
Isso funciona bem, mas não mostra o divisor sob o último item da lista. Eu preciso dele assim: mShowFirstDivider = false, mShowLastDivider = true, mas isso não vai funcionar. Alguma idéia do porquê?
nightfixed
Isso não pode lidar bem com o GridLayoutManager.
desenvolvedor android
6

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

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

private Drawable mDivider;

/**
 * Default divider will be used
 */
public DividerItemDecoration(Context context) {
    final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
    mDivider = styledAttributes.getDrawable(0);
    styledAttributes.recycle();
}

/**
 * Custom divider will be used
 */
public DividerItemDecoration(Context context, int resId) {
    mDivider = ContextCompat.getDrawable(context, resId);
}

@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
    int left = parent.getPaddingLeft();
    int right = parent.getWidth() - parent.getPaddingRight();

    int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        View child = parent.getChildAt(i);

        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

        int top = child.getBottom() + params.bottomMargin;
        int bottom = top + mDivider.getIntrinsicHeight();

        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }
}

} e use o acima, da seguinte maneira

RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);
recyclerView.addItemDecoration(itemDecoration);

Isso exibirá divisores entre cada item da lista, como mostrado abaixo:

insira a descrição da imagem aqui

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 :)

Anudeep Samaiya
fonte
1
Isso não demonstra como é o DividerItemDecorationcódigo.
IgorGanapolsky
1
É uma classe AOSP, eu desenterrar o código para você ..... gist.githubusercontent.com/alexfu/0f464fc3742f134ccd1e/raw/...
Anudeep Samaiya
Ele não funciona bem: Ele não lida com linhas diferentes de altura, e ele não mostra uma divisória vertical para grades
desenvolvedor android
5

Tarde demais, mas para GridLayoutManagereu usar isso:

public class GridSpacesItemDecoration : RecyclerView.ItemDecoration
{
    private int space;

    public GridSpacesItemDecoration(int space) {
        this.space = space;
    }

    public override void GetItemOffsets(Android.Graphics.Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
    {
        var position = parent.GetChildLayoutPosition(view);

        /// Only for GridLayoutManager Layouts
        var manager = parent.GetLayoutManager() as GridLayoutManager;

        if (parent.GetChildLayoutPosition(view) < manager.SpanCount)
            outRect.Top = space;

        if (position % 2 != 0) {
            outRect.Right = space;
        }

        outRect.Left = space;
        outRect.Bottom = space;
    }
}

Este trabalho para qualquer contagem de span que você tiver.

Ollie.

Ollie Strevel
fonte
Sobre o espaço superior, como você o alteraria para também dar suporte FlexboxLayoutManager?
desenvolvedor android
5

Você pode adicionar facilmente programaticamente.

Se o seu Gerenciador de layout for Linearlayout, você poderá usar:

DividerItemDecoration é um RecyclerView.ItemDecoration que pode ser usado como um divisor entre itens de um LinearLayoutManager. Ele suporta as orientações HORIZONTAL e VERTICAL.

 mDividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
         mLayoutManager.getOrientation());
 recyclerView.addItemDecoration(mDividerItemDecoration);

fonte

Beyaz
fonte
5

Sinto que há necessidade de uma resposta simples e baseada em código que não use XML

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);

ShapeDrawable shapeDrawableForDivider = new ShapeDrawable(new RectShape());

int dividerThickness = // (int) (SomeOtherView.getHeight() * desiredPercent);
shapeDrawableForDivider.setIntrinsicHeight(dividerThickness);
shapeDrawableForDivider.setAlpha(0);

dividerItemDecoration.setDrawable(shapeDrawableForDivider);

recyclerView.addItemDecoration(dividerItemDecoration);
Boober Bunz
fonte
4

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

<resources>
    <dimen name="divider">1dp</dimen>
</resources>

list_item.xml

<CardView
 android:layout_marginBottom="@dimen/divider"
 android:layout_marginRight="@dimen/divider">
 ...
</CardView>

list.xml

<RecyclerView
 android:paddingLeft="@dimen/divider"
 android:paddingTop="@dimen/divider"
/>
limítrio
fonte
4

Adicionei uma linha no item da lista como abaixo

<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/dividerColor"/>

1px irá desenhar a linha fina.

Se você deseja ocultar o divisor para a última linha, divider.setVisiblity(View.GONE);no onBindViewHolder do último item da lista.

Raja Peela
fonte
1
Eu prefiro este, os outros são muito complicados.
Sam Chen
3

O RecyclerViewé um pouco diferente do ListView. Na verdade, ele RecyclerViewprecisa de uma ListViewestrutura semelhante. Por exemplo, a LinearLayout. O LinearLayoutpossui parâmetros para dividir cada elemento. No código abaixo, eu tenho um RecyclerViewcomposto de CardViewobjetos 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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".ToDoList">

    <!-- A RecyclerView with some commonly used attributes -->
    <android.support.v7.widget.RecyclerView
        android:id="@+id/todo_recycler_view"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    **android:padding="@dimen/activity_vertical_margin"**>
    <!-- A CardView that contains a TextView -->
    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:elevation="30dp"
        card_view:cardElevation="3dp">
            <TextView
                android:id="@+id/info_text"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                />
    </android.support.v7.widget.CardView>
</LinearLayout>
fiacobelli
fonte
3

Uma solução realmente fácil é usar o RecyclerView-FlexibleDivider

Adicionar dependência:

compile 'com.yqritc:recyclerview-flexibledivider:1.4.0'

Adicione à sua reciclagem:

recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(context).build());

E pronto!

Cristan
fonte
funciona como um encanto ... tenho que amar o compartilhamento de código aberto.
Billy
3

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 .

        <View
            android:id="@+id/view1"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorAccent" />
vicky
fonte
3
public class CommonItemSpaceDecoration extends RecyclerView.ItemDecoration {

        private int mSpace = 0;
        private boolean mVerticalOrientation = true;

    public CommonItemSpaceDecoration(int space) {
        this.mSpace = space;
    }

    public CommonItemSpaceDecoration(int space, boolean verticalOrientation) {
        this.mSpace = space;
        this.mVerticalOrientation = verticalOrientation;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.top = SizeUtils.dp2px(view.getContext(), mSpace);
        if (mVerticalOrientation) {
            if (parent.getChildAdapterPosition(view) == 0) {
                outRect.set(0, SizeUtils.dp2px(view.getContext(), mSpace), 0, SizeUtils.dp2px(view.getContext(), mSpace));
            } else {
                outRect.set(0, 0, 0, SizeUtils.dp2px(view.getContext(), mSpace));
            }
        } else {
            if (parent.getChildAdapterPosition(view) == 0) {
                outRect.set(SizeUtils.dp2px(view.getContext(), mSpace), 0, 0, 0);
            } else {
                outRect.set(SizeUtils.dp2px(view.getContext(), mSpace), 0, SizeUtils.dp2px(view.getContext(), mSpace), 0);
            }
        }
    }
}

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.

recyclerView.addItemDecoration(new CommonItemSpaceDecoration(16));

SizeUtils.java

public class SizeUtils {
    public static int dp2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}
wizChen
fonte