RecyclerView中最后一个子项的边距/填充

我正在尝试在最后一行中添加“填充/边距底部”,并在第一行中添加“填充/边距顶部”。 我不能在项目XML中这样做,因为它会影响我所有的孩子。

我有我的RecyclerView适配器中的标题和孩子,所以我不能使用

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

我需要在每个头的最后一行分别使用它

这个问题更容易解决。 您可以将必要的填充应用到RecylerView本身,并将clipToPadding设置为false,否则,填充将切断您的滚动区域。 这是一个例子

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

看到填充将在所有方面,包括顶部和底部添加4dp。 然后clipToPadding参数确保您的子项目不被切断。 现在,为你的子项目添加4dp填充,你很好。 总共你得到8dp填充两侧和项目之间。

使用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) { if(parent.getChildAdapterPosition(view) == state.getItemCount()-1){ outRect.bottom = space; outRect.top = 0; //don't forget about recycling... } if(parent.getChildAdapterPosition(view) == 0){ outRect.top = space; outRect.bottom = 0; } } } 

 //8dp as px, value might be obtained eg from dimen resources... int space = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()); recyclerView.addItemDecoration(new SpacesItemDecoration(space)); 

您可以将填充添加到RecyclerView的顶部和底部,而不是将填充添加到顶部和底部项目,并将clipToPadding属性设置为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" /> 

由于某种原因,旧的clipToPadding=false解决scheme不适合我。 所以我添加了一个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); } } }