RecyclerView에서 마지막 자식의 여백 / 패딩
마지막 행에 Padding / Margin Bottom을, 첫 번째 행에 Padding / Margin Top을 추가하려고합니다. 모든 차일드에 영향을 미치므로 항목 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 패딩이 측면과 항목 사이에 표시됩니다.
상단 및 하단 항목 모두에 패딩을 추가하는 대신 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" />
사용 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;
}
}
}
과
//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" />
추가 android:clipToPadding="false"
하고 android:paddingBottom="100dp"
당신의 recyclerview있다.
어떤 이유로 오래된 clipToPadding=false
솔루션이 작동하지 않습니다. 그래서 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);
}
}
}
나는 더 나은 대답 @snachmsm 대답을 수정하고 올바르게 사용하는 방법을 알려줍니다.
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;
}*/
}
}
Add android:clipToPadding="false" and android:paddingBottom="65dp" in your recyclerview. If you are using fab menu button and actions on recycler view cell.
<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"/>
I use this in 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 ...
}
참고URL : https://stackoverflow.com/questions/33754445/margin-padding-in-last-child-in-recyclerview
'program story' 카테고리의 다른 글
Elasticsearch 최대 메모리 크기를 변경하는 방법 (0) | 2020.08.31 |
---|---|
E : mongodb-org 패키지를 찾을 수 없습니다. (0) | 2020.08.31 |
모달에 매개 변수를 전달하는 방법은 무엇입니까? (0) | 2020.08.31 |
자리 표시 자에 글꼴 굉장 아이콘 사용 (0) | 2020.08.31 |
Docker 컨테이너에서 환경 변수 가져 오기 (0) | 2020.08.31 |