versiones pie oreo developer descargar caracteristicas android

android - pie - Margen/relleno en el último hijo en RecyclerView



android versiones (8)

Agregue android: clipToPadding = "false" y android: paddingBottom = "65dp" en su vista de reciclaje. Si está utilizando un botón de menú fabuloso y acciones en la celda de vista del reciclador.

<androidx.recyclerview.widget.RecyclerView android:id="@+id/dinner_recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="false" android:paddingBottom="65dp"/>

Estoy tratando de agregar Padding / Margin Bottom en la última fila y Padding / Margin Top en la primera fila. No puedo hacerlo en el elemento xml, ya que afectaría a todos mis hijos.

Tengo encabezados y elementos secundarios en mi adaptador RecyclerView, por lo que no puedo usar el

android:padding="4dp" android:clipToPadding="false"

Necesito usarlo individualmente en la última primera fila de cada encabezado


En lugar de agregar relleno a los elementos superior e inferior, puede agregar el relleno a la parte superior e inferior de su RecyclerView y establecer el atributo clipToPadding en false .

<android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" android:paddingTop="8dp" android:paddingBottom="8dp" />


Este problema es aún más fácil de resolver. Puede aplicar el relleno necesario al RecylerView y establecer clipToPadding en falso, de lo contrario, el relleno clipToPadding su área de desplazamiento. Aquí hay un ejemplo

<android.support.v7.widget.RecyclerView android:padding="4dp" android:clipToPadding="false" android:layout_width="match_parent" android:layout_height="match_parent" />

Ver el relleno agregará 4dp en todos los lados, incluida la parte superior e inferior. Luego, el parámetro clipToPadding asegura que sus elementos secundarios no se corten. Ahora, agregue relleno de 4dp a todos los lados para los artículos de su hijo, y 4dp listo. En total, obtienes un relleno de 8dp en los lados y entre los artículos.


He modificado la respuesta increíble @snachmsm para mejor y te doy idea de cómo usarla correctamente

public class SpacesItemDecoration extends DividerItemDecoration { private int space; public SpacesItemDecoration(Context clContext,int oriantation,int space) { super(clContext,oriantation); this.space = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect,view,parent,state); int position = parent.getChildAdapterPosition(view); boolean isLast = position == state.getItemCount()-1; if(isLast){ outRect.bottom = space; outRect.top = 0; //don''t forget about recycling... } /* if(position == 0){ outRect.top = space; // don''t recycle bottom if first item is also last // should keep bottom padding set above if(!isLast) outRect.bottom = 0; }*/ } }


Por alguna razón, la antigua solución clipToPadding=false no me funciona. Entonces agregué un ItemDecoration

https://gist.github.com/kassim/582888fa5960791264fc92bc41fb6bcf

public class BottomPaddingDecoration extends RecyclerView.ItemDecoration { private final int bottomPadding; public BottomPaddingDecoration(int bottomPadding) { this.bottomPadding = bottomPadding; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition(); if (position == parent.getAdapter().getItemCount() - 1) { outRect.set(0, 0, 0, bottomPadding); } } }


Yo uso esto en kotlin

override fun onBindViewHolder(holder: RecyclerView.ViewHolder(view), position: Int) { if (position == itemsList.lastIndex){ val params = holder.itemView.layoutParams as FrameLayout.LayoutParams params.bottomMargin = 100 holder.itemView.layoutParams = params }else{ val params = holder.itemView.layoutParams as RecyclerView.LayoutParams params.bottomMargin = 0 holder.itemView.layoutParams = params } //other codes ... }


use ItemDecoration :

private 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) { int position = parent.getChildAdapterPosition(view); boolean isLast = position == state.getItemCount()-1; if(isLast){ outRect.bottom = space; outRect.top = 0; //don''t forget about recycling... } if(position == 0){ outRect.top = space; // don''t recycle bottom if first item is also last // should keep bottom padding set above if(!isLast) outRect.bottom = 0; } } }

y

//8dp as px int space = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()); // calculated //int space = getResources().getDimensionPixelSize( // R.dimen.list_item_padding_vertical); // from resources recyclerView.addItemDecoration(new SpacesItemDecoration(space));


<android.support.v7.widget.RecyclerView android:id="@+id/rv_tpf" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="false" android:paddingBottom="100dp" />

Agregue android:clipToPadding="false" y android:paddingBottom="100dp" en su vista de reciclaje.