Marge / remplissage dans le dernier enfant dans RecyclerView

J’essaie d’append Padding / Margin Bottom dans la dernière ligne et Padding / Margin Top dans la première ligne. Je ne peux pas le faire dans l’élément XML car cela affecterait tous mes enfants.

J’ai des en-têtes et des enfants dans mon adaptateur RecyclerView afin que je ne puisse pas utiliser le

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

Je dois l’utiliser individuellement sur la dernière première ligne de chaque en-tête

Ce problème est encore plus facile à résoudre. Vous pouvez appliquer le remplissage nécessaire à RecylerView lui-même et définir clipToPadding sur false, sinon le remplissage supprimera votre zone de défilement. Voici un exemple

  

Voir le rembourrage appenda 4dp sur tous les côtés, y compris le haut et le bas. Ensuite, le paramètre clipToPadding vérifie que vos éléments enfants ne sont pas coupés. Maintenant, ajoutez 4dp remplissage de 4dp à tous les côtés pour vos éléments enfants, et vous êtes 4dp à partir. Au total, vous obtenez un rembourrage de 8dp sur les côtés et entre les éléments.

Au lieu d’append un remplissage aux éléments supérieur et inférieur, vous pouvez simplement append le remplissage en haut et en bas de votre RecyclerView et définir l’atsortingbut clipToPadding sur false .

  

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

et

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

Pour une raison quelconque, l’ancienne solution clipToPadding=false ne fonctionne pas pour moi. J’ai donc ajouté 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); } } }