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.