recyclerview desplegable android android-recyclerview material-design

android - desplegable - menu recyclerview



¿Cómo se puede agregar una línea divisoria en un RecyclerView de Android? (18)

Estoy desarrollando una aplicación para Android donde estoy usando RecyclerView . Necesito agregar un divisor en RecyclerView . Traté de agregar

recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

a continuación está mi código xml -

<android.support.v7.widget.RecyclerView android:id="@+id/drawerList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" />



Aquí está el código para un divisor personalizado simple (divisor vertical / 1dp de altura / negro):

Supongamos que tiene una 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 la muestra 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>


Cree un archivo xml separado en la carpeta res / drawable

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

Conecte ese archivo xml (su_archivo) en la actividad principal , así:

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


Creo que estás usando Fragments para tener RecyclerView

Simplemente agregue estas líneas después de crear sus objetos RecyclerView y LayoutManager

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

¡Eso es!

Es compatible con las orientaciones HORIZONTAL y VERTICAL.


Entonces, esta podría no ser la forma correcta, pero acabo de agregar una vista a la vista de un solo elemento de RecyclerView (ya que no creo que haya una función incorporada) de esta manera:

<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 elemento tendrá una línea que lo llena en su parte inferior. Lo hice aproximadamente 1dp de alto con un fondo #111111 . Esto también le da una especie de efecto "3D".


La forma correcta es definir ItemDecoration para RecyclerView siguiente manera

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 configúrelo así

recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));

Editar

Como señaló @Alan Solitar

context.getResources().getDrawable(R.drawable.line_divider);

se deprecia en lugar de eso puedes usar

ContextCompat.getDrawable(context,R.drawable.line_divider);


Necesita agregar la siguiente línea ...

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


Para que la respuesta de NJ sea un poco más simple, puede hacer:

public class DividerColorItemDecoration extends DividerItemDecoration { public DividerColorItemDecoration(Context context, int orientation) { super(context, orientation); setDrawable(ContextCompat.getDrawable(context, R.drawable.line_divider)); } }


Por desgracia, Android solo complica las cosas pequeñas. La forma más fácil de lograr lo que desea, sin implementar DividerItemDecoration aquí:

Agregue el color de fondo al RecyclerView al color del divisor deseado:

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

Agregue el 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 gris oscuro aparecería como divisor).


Prueba este código simple de una sola línea

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


Puede crear un divisor simple reutilizable.

Crear divisor:

public class DividerItemDecorator extends RecyclerView.ItemDecoration { private Drawable mDivider; public DividerItemDecorator(Drawable divider) { mDivider = divider; } @Override public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { int dividerLeft = parent.getPaddingLeft(); int dividerRight = 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 dividerTop = child.getBottom() + params.bottomMargin; int dividerBottom = dividerTop + mDivider.getIntrinsicHeight(); mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom); mDivider.draw(canvas); } } }

Crear línea divisoria: 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/grey_300" /> </shape>

Agregue el divisor a su vista Recycler:

RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecorator(ContextCompat.getDrawable(context, R.drawable.divider)); recyclerView.addItemDecoration(dividerItemDecoration);

Para eliminar el divisor del último elemento:

Para evitar el dibujo del divisor para el último elemento, debe cambiar esta línea.

for (int i = 0; i < childCount; i++)

A

for (int i = 0; i < childCount-1; i++)

Su implementación final debería ser así:

public class DividerItemDecorator extends RecyclerView.ItemDecoration { private Drawable mDivider; public DividerItemDecorator(Drawable divider) { mDivider = divider; } @Override public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { int dividerLeft = parent.getPaddingLeft(); int dividerRight = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount - 1; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int dividerTop = child.getBottom() + params.bottomMargin; int dividerBottom = dividerTop + mDivider.getIntrinsicHeight(); mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom); mDivider.draw(canvas); } } }

Espero eso ayude:)


Si desea tener divisores horizontales y verticales:

  1. Definir elementos de dibujo 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>

  2. Agregue 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);


Simplemente agregue un margen de x cantidad en la parte inferior de un elemento en su RecycleView Adapter .

onCreateViewHolder

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(0, 0, 0, 5); itemView.setLayoutParams(layoutParams);


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

ACTUALIZAR:

Para mejores resultados, convierta 1px a 1dp :

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


Todas estas respuestas me acercaron, pero a cada una le faltaba un detalle clave. Después de un poco de investigación, encontré que la ruta más fácil es una combinación de estos 3 pasos:

  1. Utilice la biblioteca de soporte https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html
  2. Crea un divisor con el color correcto
  3. Establezca este divisor en su tema como listDivider

Paso 1: mientras configura 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>

EDITAR: 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, lo cual era molesto. Así que modifiqué el Paso 1 de la siguiente manera para anular ese comportamiento predeterminado en DividerItemDecoration (por supuesto, hacer una clase separada es 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); } } } );


Versión Kotlin:

recyclerview.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))


RecyclerView-FlexibleDivider yqritc hace que este sea un trazador de líneas. 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 configure el adaptador de su 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());


recyclerview.addItemDecoration(new DividerItemDecoration(this, 0));

Donde 0 es horizontal y 1 es crítico