¿Cómo se puede agregar una línea de divisor en un Android RecyclerView?
Estoy desarrollando una aplicación de Android donde estoy usando RecyclerView
. Necesito agregar un divisor en RecyclerView
. Traté de añadir –
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
Abajo está mi código xml –
- Deslizar un elemento a la vez
- Desplazar RecyclerView para mostrar el elemento seleccionado en la parte superior
- ¿Cómo guardar y restaurar la posición exacta de desplazamiento de RecyclerView?
- Centrar un CardView en un RecyclerView con un solo elemento
- LinearLayoutManager setReverseLayout () == true pero pila de elementos desde la parte inferior
<android.support.v7.widget.RecyclerView android:id="@+id/drawerList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" />
- Horizontal RecyclerView dentro de ListView sin desplazamiento muy suave
- ¿Deberíamos usar RecyclerView para reemplazar ListView?
- NotifyDataSetChange no funciona en RecyclerView
- Android RecyclerView que se encuentra en un fragmento que se encuentra en un ViewPager no vuelve a cargar / refrescar las vistas si se alcanza el setOffscreenPageLimit
- Pantalla Android Parpadea en mostrar / ocultar barras del sistema
- Span múltiples columnas con RecyclerView
- Recycler View Adapter con EditText
- Aplicación android de Gmail como vista de lista con una letra en el icono
La forma correcta es definir ItemDecoration
para el RecyclerView
es como sigue
SimpleDividerItemDecoration.java
public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; public SimpleDividerItemDecoration(Context context) { mDivider = context.getResources().getDrawable(R.drawable.line_divider); } @Override 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); } } }
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="@color/dark_gray" /> </shape>
Finalmente, ponlo así
recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
Editar
Como señaló @Alan Solitar
context.getResources().getDrawable(R.drawable.line_divider);
Se deprecia en lugar de que puede utilizar
ContextCompat.getDrawable(context,R.drawable.line_divider);
En la actualización de octubre de 2016, la biblioteca de soporte v25.0.0 ahora tiene una implementación por defecto de divisores horizontales y verticales básicos disponibles!
https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html
mDividerItemDecoration = new DividerItemDecoration( recyclerView.getContext(), mLayoutManager.getOrientation() ); recyclerView.addItemDecoration(mDividerItemDecoration);
Simplemente agregue una vista al final de su adaptador de artículo:
<View android:layout_width="match_parent" android:layout_height="1px" android:background="#FFFFFF"/>
Si desea tener divisores horizontales y verticales:
-
Definir divisores horizontales y verticales:
Horizontal_divider.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <size android:height="1dip" /> <solid android:color="#22000000" /> </shape>
Vertical_divider.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <size android:width="1dip" /> <solid android:color="#22000000" /> </shape>
-
Añadir este segmento de código a continuación:
DividerItemDecoration verticalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.HORIZONTAL); Drawable verticalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.vertical_divider); verticalDecoration.setDrawable(verticalDivider); recyclerview.addItemDecoration(verticalDecoration); DividerItemDecoration horizontalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.VERTICAL); Drawable horizontalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.horizontal_divider); horizontalDecoration.setDrawable(horizontalDivider); recyclerview.addItemDecoration(horizontalDecoration);
Aquí está el código de un divisor personalizado simple (divisor vertical / 1dp altura / negro):
Supongamos que tiene la biblioteca de soporte:
compile "com.android.support:recyclerview-v7:25.1.1"
Código java
DividerItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.my_custom_divider)); recyclerView.addItemDecoration(divider);
Entonces el ejemplo del archivo custom_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>
Todas estas respuestas me acercaron, pero cada uno de ellos faltaba un detalle clave. Después de un poco de investigación, encontré la ruta más fácil para ser una combinación de estos 3 pasos:
- Utilice DividerItemDecoration de la biblioteca de soporte
- Crear un divisor con el color correcto
- Establezca este divisor en su tema como el listDivider
Paso 1: durante la configuración de RecyclerView
recyclerView.addItemDecoration( new DividerItemDecoration(context, layoutManager.getOrientation()));
Paso 2: en un archivo como res / drawable / divider_gray.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <size android:width="1px" android:height="1px" /> <solid android:color="@color/gray" /> </shape>
Paso 3: en el tema de la aplicación
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Other theme items above --> <item name="android:listDivider">@drawable/divider_gray</item> </style>
EDIT: Actualizado para omitir el último divisor:
Después de usar esto un poco, me di cuenta de que estaba dibujando un divisor después del último elemento, que era molesto. Por lo tanto, modifiqué el paso 1 de la siguiente manera para reemplazar el comportamiento predeterminado en DividerItemDecoration (por supuesto, hacer que una clase independiente sea otra opción):
recyclerView.addItemDecoration( new DividerItemDecoration(context, layoutManager.getOrientation())) { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); // hide the divider for the last child if (position == parent.getAdapter().getItemCount() - 1) { outRect.setEmpty(); } else { super.getItemOffsets(outRect, view, parent, state); } } } );
Así que esto podría no ser la forma correcta, pero acabo de agregar una vista a la vista de elemento único del recyclerView (como no creo que haya una función incorporada) como así:
<View android:layout_width="fill_parent" android:layout_height="@dimen/activity_divider_line_margin" android:layout_alignParentBottom="true" android:background="@color/tasklist_menu_dividerline_grey" />
Esto significa que cada artículo tendrá una línea que lo llene en su parte inferior. Lo hice sobre 1dp alto con un fondo # 111111. Esto también le da una especie de efecto "3D".
El RecyclerView-FlexibleDivider de yqritc hace de este un solo revestimiento. Primero agregue esto a su build.gradle
:
compile 'com.yqritc:recyclerview-flexibledivider:1.4.0' // requires jcenter()
Ahora puede configurar y agregar un divisor donde establezca el adaptador de recyclerView:
recyclerView.setAdapter(myAdapter); recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this).color(Color.RED).sizeResId(R.dimen.divider).marginResId(R.dimen.leftmargin, R.dimen.rightmargin).build());
Para hacer la respuesta de NJ un poco más simple que usted puede hacer:
public class DividerColorItemDecoration extends DividerItemDecoration { public DividerColorItemDecoration(Context context, int orientation) { super(context, orientation); setDrawable(ContextCompat.getDrawable(context, R.drawable.line_divider)); } }
Android sólo hace cosas pequeñas demasiado complicado por desgracia. La forma más fácil de lograr lo que quieres, sin implementar DividerItemDecoration aquí:
Añada el color de fondo al RecyclerView al color deseado del divisor:
<RecyclerView android:id="@+id/rvList" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@color/colorLightGray" android:scrollbars="vertical" tools:listitem="@layout/list_item" android:background="@android:color/darker_gray"/>
Añadir margen inferior (android: layout_marginBottom) a la raíz de diseño del elemento (list_item.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:layout_marginBottom="1dp"> <TextView android:id="@+id/tvName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="John Doe" /> <TextView android:id="@+id/tvDescription" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tvName" android:text="Some description blah blah" /> </RelativeLayout>
Esto debería dar espacio de 1dp entre los elementos y el color de fondo de RecyclerView (que es de color gris oscuro aparecería como divisor).
- No se encontró error de repositorio en la instalación de ADT en eclipse Indigo
- Biblioteca de diseño de Android – Problemas de relleno / margen de botón de acción flotante