¿Cómo agregar divisores y espacios entre elementos en RecyclerView?

938

Este es un ejemplo de cómo podría haberse hecho previamente en la ListViewclase, utilizando los parámetros divider y 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"/>

Sin embargo, no veo esa posibilidad en la RecyclerViewclase.

<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"/>

En ese caso, ¿está bien definir márgenes y / o agregar una vista divisoria personalizada directamente en el diseño de un elemento de lista o hay una mejor manera de lograr mi objetivo?

Ojos claros
fuente
Esto me ayudó: stackoverflow.com/questions/26892296/…
Jared Burrows el
@EyesClear Agregue elementos <TextView /> otro xml y úselo en la lista Misma actividad.
Amitsharma
77
Hay una clase en support lib com.homeretailgroup.argos.android.view.decorators.DividerItemDecorationy mRecyclerView.addItemDecoration(new DividerItemDecoration(activity, LinearLayoutManager.VERTICAL));
úsela así
Puede agregar un margen inferior a su elemento de lista para listas verticales y tal vez se pueda usar como divisor.
resw67
La forma más simple es agregar márgenes superiores / inferiores alrededor del primer elemento en la fila del adaptador. android: layout_marginBottom = "4dp". (Tenga en cuenta que agregar los márgenes al diseño principal no lo cortará).
pstorli

Respuestas:

1228

Actualización de octubre de 2016

La versión 25.0.0 de Android Support Library introdujo la DividerItemDecorationclase:

DividerItemDecoration es un RecyclerView.ItemDecoration que se puede usar como un divisor entre los elementos de a LinearLayoutManager. Es compatible con ambos HORIZONTALy VERTICALorientaciones.

Uso:

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

Respuesta anterior

Algunas respuestas usan métodos que han quedado obsoletos, o no dan una solución completa, por lo que intenté hacer un resumen breve y actualizado.


A diferencia ListView, la RecyclerViewclase no tiene parámetros relacionados con el divisor. En cambio, necesita extender ItemDecoration, RecyclerViewla clase interna de a:

Un ItemDecorationpermite que la aplicación agregue un desplazamiento especial de dibujo y diseño a vistas de elementos específicos del conjunto de datos del adaptador. Esto puede ser útil para dibujar divisores entre elementos, resaltados, límites de agrupación visual y más.

Todo ItemDecorationsse dibujan en el orden en que se agregaron, antes de que las vistas de elementos (en onDraw()) y después de los artículos (en onDrawOver ( Canvas, RecyclerView, RecyclerView.State).

Vertical espaciado ItemDecoration

Extienda ItemDecoration, agregue un constructor personalizado que tome espacio heightcomo parámetro y getItemOffsets()método de anulación :

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;
    }
}

Si no desea insertar espacio debajo del último elemento, agregue la siguiente condición:

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

Nota: también se puede modificar outRect.top, outRect.lefty outRect.rightpropiedades para el efecto deseado.

Divisor ItemDecoration

Método de extensión ItemDecorationy anulación 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);
        }
    }
}

Puede llamar al primer constructor que usa los atributos de divisor de Android predeterminados, o al segundo que usa su propio dibujable, por ejemplo 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: si desea que el divisor se dibuje sobre sus elementos, anule el onDrawOver()método en su lugar.

Uso

Para usar su nueva clase add VerticalSpaceItemDecorationo DividerSpaceItemDecorationto RecyclerView, por ejemplo en el onCreateView()método de su 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;
}

También está la biblioteca de Lucas Rocha, que se supone que simplifica el proceso de decoración del artículo. Aunque no lo he intentado.

Entre sus características están:

  • Una colección de decoraciones de artículos en stock que incluyen:
  • Separación entre elementos Divisores horizontales / verticales.
  • Elemento de la lista
Ojos claros
fuente
3
@droppin_science Corrígeme si me equivoco, pero no creo ningún objeto onDraw(). Solo hago referencia a instancias ya existentes.
EyesClear
1
Me pregunto si es una buena idea usar Paint en lugar de crear un dibujo. Entonces puedo llamar canvas.drawLine(startX, startY, stopX, stopY, mPaint)en onDrawOver? ¿Alguna diferencia de rendimiento?
Primero
1
Solo un comentario informativo: siempre agregue el espacio al último elemento si planea agregar elementos más adelante en su lista. Si no lo hace, al agregar un elemento, no tendrá espacio. Gracias por el VerticalSpace!
Tsuharesu
24
DividerItemDecoration como se muestra arriba no funcionará si los elementos son completamente opacos, los divisores se sobregirarán por los elementos. En ese caso, también debe anular getItemOffsets () y agregar el desplazamiento inferior a outRect para que el divisor termine fuera del elemento. Alternativamente, puede anular onDrawOver () en lugar de onDraw () para dibujar el divisor después del elemento.
jpop
116
La mejor respuesta es una página completa de código para agregar un divisor a recyclerView. La culpa es tuya, google.
cuidadoso7j
480

Solo agrega

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

También es posible que deba agregar la dependencia
compile 'com.android.support:recyclerview-v7:27.1.0'

EDITAR:

Para personalizarlo un poco, puede agregar un dibujo personalizado:

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

Puede usar cualquier dibujo personalizado, por ejemplo:

<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
fuente
La actividad no es necesaria. El contexto es suficiente
mac229
Esta debe ser la respuesta correcta. Por favor, cambie getActivity a solo contexto.
Jhon Fredy Trujillo Ortega
También es mejor obtener orientación de su LayoutManager.
lsrom
¡Gracias! También puede usar Configurationpara el divisor vertical:if (orientation == Configuration.ORIENTATION_LANDSCAPE) { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL)); } else { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));}
AlexS
3
Buena respuesta, pero agrega un divisor también después del último elemento.
CoolMind
256

¿Puedo dirigir su atención a este archivo en particular en Github por Alex Fu: https://gist.github.com/alexfu/0f464fc3742f134ccd1e

Es el archivo de ejemplo DividerItemDecoration.java "extraído directamente de las demostraciones de soporte". ( Https://plus.google.com/103498612790395592106/posts/VVEB3m7NkSS )

Pude obtener líneas divisorias muy bien después de importar este archivo en mi proyecto y agregarlo como decoración de un elemento a la vista del reciclador.

Así es como se ve mi onCreateView en mi fragmento que contiene la vista Recycler:

@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;
}

Estoy seguro de que se puede hacer un estilo adicional, pero es un punto de partida. :)

Duy Nguyen
fuente
¿Cómo agrega reemplazar esos: "footerDividersEnabled", "headerDividersEnabled", "listSelector", "fastScrollEnabled", "smoothScrollbar", "textFilterEnabled"?
Desarrollador de Android
¿Alguna entrada sobre cómo poner estilo?
nizam.sp
para diseñar esta solución, debe anular el atributo "android: listDivider" en su tema
Pavel Dudka
1
El divisor no funciona con RecyclerView. Necesita usar RecyclerView.itemDecoration. Vea esta respuesta: stackoverflow.com/a/27664023/2311451
Cocorico
3
¿Por qué el divisor expande todo el ancho del elemento? cómo mostrar como en las especificaciones google.com/design/spec/components/lists.html#lists-specs
chip
156

ItemDecorationImplementación simple para espacios iguales entre todos los elementos.

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
fuente
estoy obteniendo el espacio, pero ¿cómo consigo un divisor?
Pankaj Nimgade
26
getChildPositionahora está en desuso, getChildAdapterPositionse puede usar en su lugar.
EyesClear
44
No olvide (como lo hice) eliminar la llamada super.getItemOffsets, o sus compensaciones se sobrescribirán.
jayeffkay
@EyesClear no debería getChildLayoutPosition usarse?
Avinash R
3
¿implementa esto el espaciado en píxeles?
asqueroso
108

La simple es establecer el color de fondo para RecyclerView y un color de fondo diferente para los elementos. Aquí hay un ejemplo ...

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

y el elemento TextView (aunque puede ser cualquier cosa) con margen inferior "x" dp o px.

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

La salida ...

ingrese la descripción de la imagen aquí

Madan Sapkota
fuente
2
¡Qué truco! solo necesita mantener la lista en blanco mientras se carga.
Hamzeh Soboh
36
¡Cuidado con el sobregiro!
shem
@shem ¿podrías elaborar?
RominaV
77
Al dibujar en Android un par de capas una encima de la otra (el fondo de la actividad, el fondo de la vista de reciclaje y el fondo de la vista del elemento): Android las dibuja todas, también las que no son visibles para los usuarios. Eso llamó sobregiro y podría afectar su rendimiento, más sobre esto aquí: youtube.com/watch?v=T52v50r-JfE
shem
41

Creo que usar un divisor simple lo ayudará

a agregar un divisor a cada elemento:
1- Agregue esto al directorio dibujable 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- Crear clase SimpleDividerItemDecoration
Utilicé este ejemplo para definir esta clase:
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- En la actividad o fragmento que usa RecyclerView, dentro de onCreateView agrega esto:

@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 agregar espacio entre los elementos
, solo necesita agregar la propiedad de relleno a la vista del elemento

<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
fuente
¿Cómo hago que funcione para GridLayoutManager, para mostrar también divisores verticales entre las celdas?
Desarrollador de Android
2
resources.getDrawable () ahora está en desuso. Puede pasar en el contexto y usar ContextCompat.getDrawable (contexto, R.drawable.line_divider)
Eric B.
36

Como he establecido ItemAnimators. losItemDecorator no entrar o salir junto con la animación.

Simplemente terminé teniendo una línea de vista en mi archivo de diseño de vista de elemento de cada elemento. Resolvió mi caso. DividerItemDecorationse sentía demasiado hechicero para un simple 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
fuente
Tienes razón. Las animaciones no funcionan con ItemDecoration. No estoy seguro de por qué, pero sin especificar nada, obtengo animaciones y me resulta muy molesto y feo que las líneas creadas por ItemDecoration no sigan. Entonces usaré una solución como la suya.
Michel
¿Cómo manejaste el último artículo?
Mayor Dios
@oldergod. Usted señaló el punto de dolor correcto. Primero, estaría de acuerdo en que un diseño también tenga un divisor en el último elemento. Pero si no quieres eso. asigne una identificación a esta vista y oculte en bindView si la posición es la última.
Javanator
@Javanator veo bien, el mismo enfoque que tomé. Gracias.
oldgod
lo más simple es lo mejor
hyyou2010
27

Esto es simple, no necesitas un código tan complicado

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

Agregue esto en su dibujo: 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
fuente
21

Dado que todavía no hay una forma correcta de implementar esto correctamente usando Material Design, acabo de hacer el siguiente truco para agregar un divisor en el elemento de la lista directamente:

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dividerColor"/>
Yoann Hercouet
fuente
DividerItemDecoration deja de funcionar después de tener información de elevación del diseño del material (para obtener el mismo efecto que en la Bandeja de entrada); se volvió demasiado complicado para una cosa simple. Esta solución es simple y funciona.
DenisGL
21

La forma en que estoy manejando la vista del divisor y también las inserciones del divisor es agregando una extensión RecyclerView.

1)

Agregue un nuevo archivo de extensión nombrando View o RecyclerView:

RecyclerViewExtension.kt

y agregue el setDividermétodo de extensión dentro del archivo 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)

Cree un archivo de recursos Drawable dentro del drawablepaquete 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>

donde puede especificar el margen izquierdo y derecho en android:insetLefty android:insetRight.

3)

En su Actividad o Fragmento donde se inicializa RecyclerView, puede establecer el dibujo personalizado llamando a:

recyclerView.setDivider(R.drawable.recycler_view_divider)

4)

Saludos 🍺

RecyclerView fila con divisor.

Gent Berani
fuente
16

Si alguien está buscando agregar solo, digamos, un espacio de 10dp entre elementos, puede hacerlo estableciendo un dibujable para DividerItemDecoration:

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

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

¿Dónde divider_10dpestá un recurso extraíble que contiene:

<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
fuente
11

Para aquellos que están buscando sólo para los espacios entre los elementos en el RecyclerViewver a mi enfoque en el que se obtiene espacios iguales entre todos los elementos, excepto en los primeros y últimos artículos donde di un acolchado más grande. Solo aplico relleno a izquierda / derecha en horizontal LayoutManagery a arriba / abajo en 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
fuente
11

Agregue un margen a su vista, funcionó para mí.

android:layout_marginTop="10dp"

Si solo desea agregar un espaciado igual y desea hacerlo en XML , simplemente establezca paddingsu valor RecyclerViewy la misma cantidad del layoutMarginelemento que infla en su RecyclerView, y deje que el color de fondo determine el color del espaciado.

Materia cuántica
fuente
3
Aunque esto funcionará, esta no es la respuesta correcta, por ejemplo, porque esto no resuelve el problema sin hacer cosas adicionales en el diseño de la fila, también, en la parte superior aparecerá el margen x1, entre las filas aparecerá el margen x2.
Sreekanth Karumanaghat
Esta no es una buena idea porque el overscrollefecto al tirar al final de la lista tendrá un relleno innecesario aplicado cuando se aplique el rellenoRecyclerView
AeroEchelon
Es mejor ajustar el diseño del elemento en una vista de tarjeta de biblioteca de soporte para que pueda controlar otros atributos, por ejemplo, elevación / 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
  • Aquí hay un simple truco para agregar divisor
  • Simplemente agregue un fondo al diseño de su elemento de reciclaje de la siguiente manera

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

Cree el siguiente shape_border.xml en la carpeta dibujable

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

Aquí está el resultado final: un RecyclerView con divisor.

Aquí está el resultado final: un RecyclerView con divisor.

turbandroid
fuente
1
Este no es un enfoque preferido. Aunque la respuesta @EyesClear inicia int's en onDraw y parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1probablemente debería ser parent.getChildAdapterPosition(view) > 0con el outRect.bottom = mVerticalSpaceHeightdevenir outRect.top = mVerticalSpaceHeight, debería ser la respuesta aceptada.
droppin_science
@droppin_science: no puede descuidarlo diciendo que este no es un enfoque preferido, me da resultados precisos como se esperaba, también miro la respuesta de EyesClear pero esa respuesta es demasiado complicada para un simple divisor, sin embargo, si es necesario haz una decoración adicional con el artículo, entonces esa puede ser la respuesta aceptada.
turbandroid
Para los votantes con baja, esta respuesta se dio en el momento en que no había clases oficiales para DividerItemDecoration, así que solo compare la brecha de tiempo entre esta respuesta y la siguiente respuesta dada por Leo Droidcoder. :)
turbandroid
9

Bifurqué el DividerItemDecoration de una esencia anterior y lo simplifiqué para que se adaptara a mi caso de uso, y también lo modifiqué para dibujar los divisores de la forma en que se dibujan en ListView, incluido un divisor después del último elemento de la lista. Esto también manejará animaciones verticales de ItemAnimator:

1) Agregue esta clase a su proyecto:

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) Agregue el decorador a su RecylerView:

recyclerView.addItemDecoration(new DividerItemDecoration(getActivity()));
Aprende OpenGL ES
fuente
Correcto, está destinado a un LinearLayoutManager. Puede tomar la idea detrás de esto para adaptarlo a un GridLayoutManager.
Aprenda OpenGL ES
8

En lugar de crear un shape xmlcambio, la altura y el color del divisor. Puedes crear programáticamente 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
fuente
esta es una respuesta útil
taha
7

Tomado de una búsqueda en google, agregue este ItemDecoration a su 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
fuente
Esto funciona bien solo para LinearLayoutManager. ¿Qué se debe hacer para GridLayoutManager?
Desarrollador de Android
6

Este enlace funcionó como un encanto para mí:

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.");
        }
    }
}

Luego en tu actividad:

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

O esto si estás usando un fragmento:

mCategoryRecyclerView.addItemDecoration(
    new DividerItemDecoration(getActivity(), null));
Micro
fuente
1
Esto funciona bien, pero no muestra el divisor debajo del último elemento de la lista. Lo necesito como esto: mShowFirstDivider = false, mShowLastDivider = true, pero no va a funcionar. ¿Alguna idea de por qué?
arreglado el
Esto no puede manejar bien GridLayoutManager.
Desarrollador de Android
6

Podemos decorar los artículos usando varios decoradores adjuntos a la vista del reciclador, como la DividerItemDecoration:

Simplemente use lo siguiente ... tomado de la respuesta 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);
    }
}

} y luego use lo anterior de la siguiente manera

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

Esto mostrará divisores entre cada elemento dentro de la lista como se muestra a continuación:

ingrese la descripción de la imagen aquí

Y para aquellos que buscan más detalles, pueden consultar esta guía Uso de RecyclerView _ CodePath Android Cliffnotes

Algunas respuestas aquí sugieren el uso de márgenes, pero el problema es que: si agrega los márgenes superior e inferior, aparecerán agregados entre los elementos y serán demasiado grandes. Si solo agrega cualquiera, no habrá margen en la parte superior o inferior de toda la lista. Si agrega la mitad de la distancia en la parte superior, la mitad en la parte inferior, los márgenes exteriores serán demasiado pequeños.

Por lo tanto, la única solución estéticamente correcta es el divisor que el sistema sabe dónde aplicar correctamente: entre elementos, pero no arriba o debajo de los elementos.

Por favor, hágame saber cualquier duda en los comentarios a continuación :)

Anudeep Samaiya
fuente
1
Esto no muestra el DividerItemDecorationaspecto del código.
IgorGanapolsky
1
Es una clase AOSP, desenterré el código para usted ..... gist.githubusercontent.com/alexfu/0f464fc3742f134ccd1e/raw/…
Anudeep Samaiya
No funciona bien: no maneja filas de diferentes alturas y no muestra un divisor vertical para cuadrículas
desarrollador de Android
5

Demasiado tarde, pero GridLayoutManageryo uso esto:

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 trabajo para cualquier recuento de tramo que tenga.

Ollie.

Ollie Strevel
fuente
Sobre el espacio superior, ¿cómo lo cambiarías para que también sea compatible FlexboxLayoutManager?
Desarrollador de Android
5

Puede agregar con programáticamente fácil.

Si su Administrador de diseño es Linearlayout, puede usar:

DividerItemDecoration es un RecyclerView.ItemDecoration que se puede usar como un divisor entre los elementos de un LinearLayoutManager. Es compatible con las orientaciones HORIZONTAL y VERTICAL.

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

fuente

Beyaz
fuente
5

Siento que hay una necesidad de una respuesta simple basada en código que no 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
fuente
4

Si desea agregar el mismo espacio para los elementos, la forma más simple es agregar el relleno superior + izquierdo para RecycleView y los márgenes derecho + inferior a los elementos de la tarjeta.

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"
/>
limitium
fuente
4

He agregado una línea en el elemento de la lista como a continuación

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

1px dibujará la línea delgada.

Si desea ocultar el divisor de la última fila, divider.setVisiblity(View.GONE);en onBindViewHolder para el último elemento de la lista.

Raja Peela
fuente
1
Prefiero este, los otros son demasiado complicados.
Sam Chen el
3

El RecyclerViewes un poco diferente del ListView. En realidad, RecyclerViewnecesita una ListViewestructura similar. Por ejemplo, a LinearLayout. El LinearLayouttiene parámetros para la división de cada elemento. En el siguiente código, tengo un conjunto RecyclerViewde CardViewobjetos dentro de a LinearLayoutcon un "relleno" que pondrá algo de espacio entre los elementos. Haz ese espacio realmente pequeño y obtendrás una línea.

Aquí está la vista Recycler en 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>

Y así es como se ve cada elemento (y se muestra como dividido debido al androide: relleno en el diseño lineal que rodea todo) en otro archivo: 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
fuente
3

Una solución realmente fácil es usar RecyclerView-FlexibleDivider

Añadir dependencia:

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

Agregue a su vista de reciclador:

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

¡Y tu estas listo!

Cristan
fuente
funciona como un encanto ... tengo que amar el intercambio de código abierto.
Billy
3

1.Una de las formas es mediante el uso de la vista de tarjeta y la vista de reciclador juntos , podemos agregar fácilmente efectos como divisor. ex. https://developer.android.com/training/material/lists-cards.html

2.y otro es agregando la vista como divisor a list_item_layout de la vista del reciclador .

        <View
            android:id="@+id/view1"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorAccent" />
vicky
fuente
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);
            }
        }
    }
}

Esto agregará espacio en la parte superior e inferior de cada elemento (o izquierda y derecha). Luego, puede configurarlo en su 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
fuente