remove recyclerview notifyitemremoved limpiar item delete all android android-recyclerview divider

notifyitemremoved - remove all items recyclerview android



RecyclerView elimina el divisor/decorador despuĂ©s del Ășltimo elemento (6)

Aquí está la clase DividerDecorator uso en mis aplicaciones que elimina la última línea del último elemento.

public class DividerDecorator extends RecyclerView.ItemDecoration { private Drawable mDivider; public DividerDecorator(Context context) { mDivider = context.getResources().getDrawable(R.drawable.recyclerview_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); } } }

Puedes configurarlo en tu RecyclerView con el siguiente código:

mRecyclerViewEvent.addItemDecoration(new DividerDecorator(context));

Aquí está el recyclerview_divider.xml

<size android:width="1dp" android:height="1dp" /> <solid android:color="@color/DividerColor" />

Tengo un RecyclerView bastante simple. Así es como configuro el divisor.

DividerItemDecoration itemDecorator = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL); itemDecorator.setDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.news_divider)); recyclerView.addItemDecoration(itemDecorator);

Y esto es drawable / news_divider.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="@color/white_two"/> <size android:height="1dp"/> </shape>

El problema es por alguna estúpida razón por la cual el divisor no se crea entre los elementos. Pero también después del último artículo. Y lo quiero solo entre los elementos no después de cada elemento.

¿Alguna idea de cómo evitar que el divisor se muestre después del último elemento?

Saludos y gracias


Crea tu propia clase Divider ( Ejemplo aquí )

En el código que dibuja el divisor, verifique primero si está dibujando el divisor para el último elemento de la lista. Si es así, no lo dibujes.

Solo tenga en cuenta que si anula OnDrawOver se dibuja en la parte SUPERIOR de su vista, incluidas las barras de desplazamiento, etc. Lo mejor es atenerse a OnDraw . Muchos ejemplos en Google, pero this es un buen tutorial sobre cómo crear tus propios decoradores.


Esta es una versión personalizada de la compatibilidad con Android DividerItemDecoration que ignora el último elemento:

https://gist.github.com/mohsenoid/8ffdfa53f0465533833b0b44257aa641

La principal diferencia es:

private fun drawVertical(canvas: Canvas, parent: RecyclerView) { canvas.save() val left: Int val right: Int if (parent.clipToPadding) { left = parent.paddingLeft right = parent.width - parent.paddingRight canvas.clipRect(left, parent.paddingTop, right, parent.height - parent.paddingBottom) } else { left = 0 right = parent.width } val childCount = parent.childCount for (i in 0 until childCount - 1) { val child = parent.getChildAt(i) parent.getDecoratedBoundsWithMargins(child, mBounds) val bottom = mBounds.bottom + Math.round(child.translationY) val top = bottom - mDivider!!.intrinsicHeight mDivider!!.setBounds(left, top, right, bottom) mDivider!!.draw(canvas) } canvas.restore() } private fun drawHorizontal(canvas: Canvas, parent: RecyclerView) { canvas.save() val top: Int val bottom: Int if (parent.clipToPadding) { top = parent.paddingTop bottom = parent.height - parent.paddingBottom canvas.clipRect(parent.paddingLeft, top, parent.width - parent.paddingRight, bottom) } else { top = 0 bottom = parent.height } val childCount = parent.childCount for (i in 0 until childCount - 1) { val child = parent.getChildAt(i) parent.layoutManager.getDecoratedBoundsWithMargins(child, mBounds) val right = mBounds.right + Math.round(child.translationX) val left = right - mDivider!!.intrinsicWidth mDivider!!.setBounds(left, top, right, bottom) mDivider!!.draw(canvas) } canvas.restore() }


La respuesta aceptada no asigna espacio para la decoración, ya que no reemplaza a getItemOffsets()

He ajustado la DividerItemDecoration de la biblioteca de soporte para excluir la decoración del último elemento.

public class DividerItemDecorator extends RecyclerView.ItemDecoration { private Drawable mDivider; private final Rect mBounds = new Rect(); public DividerItemDecorator(Drawable divider) { mDivider = divider; } @Override public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { canvas.save(); final int left; final int right; if (parent.getClipToPadding()) { left = parent.getPaddingLeft(); right = parent.getWidth() - parent.getPaddingRight(); canvas.clipRect(left, parent.getPaddingTop(), right, parent.getHeight() - parent.getPaddingBottom()); } else { left = 0; right = parent.getWidth(); } final int childCount = parent.getChildCount(); for (int i = 0; i < childCount - 1; i++) { final View child = parent.getChildAt(i); parent.getDecoratedBoundsWithMargins(child, mBounds); final int bottom = mBounds.bottom + Math.round(child.getTranslationY()); final int top = bottom - mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(canvas); } canvas.restore(); } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if (parent.getChildAdapterPosition(view) == state.getItemCount() - 1) { outRect.setEmpty(); } else outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } }

Para aplicar el decorador, utilice

RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecorator(dividerDrawable); recyclerView.addItemDecoration(dividerItemDecoration);

La fuente para incluir orientación se puede encontrar aquí https://gist.github.com/abdulalin/146f8ca42aa8322692b15663b8d508ff


Pruebe este Código, no mostrará divisor para el último elemento.

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

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>

Configure su divisor de esta manera:

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


Tal como se propone here , puede extender DividerItemDecoration de esta manera:

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

[ACTUALIZAR]
@Rebecca Hsieh señaló:

Esto funciona cuando su vista de elemento en RecyclerView no tiene un fondo transparente, por ejemplo,

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="#ffffff"> ... </LinearLayout>

RecyclerView llama a DividerItemDecoration.getItemOffsets para medir la posición del niño. Esta solución pondrá el último divisor detrás del último elemento. Por lo tanto, la vista del elemento en RecyclerView debe tener un fondo para cubrir el último divisor y esto hace que se vea como oculto.