web-dev-qa-db-ja.com

RecyclerViewの最後の子のマージン/パディング

最後の行にPadding/Margin Bottomを追加し、最初の行にPadding/Margin Topを追加しようとしています。これは、すべてのChildsに影響するため、アイテムxmlで実行できません。

私はRecyclerViewアダプターにヘッダーと子を持っているので、使用できません

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

各ヘッダーの最後の最初の行で個別に使用する必要があります

89
RedEagle

この問題はさらに簡単に解決できます。 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のパディングが得られます。

177
Subin Sebastian

上下両方のアイテムにパディングを追加する代わりに、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" />
57

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));
32
snachmsm
 <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" />

RecyclerviewにAndroid:clipToPadding="false"およびAndroid:paddingBottom="100dp"を追加します。

10
darshan patel

何らかの理由で、古い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);
        }
    }
}
2
kassim

私は素晴らしい答え@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;
        }*/
    }
}
1
sourav pandit

私はコトリンでこれを使用します

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 ...
}
0
Radesh

RecyclerviewにAndroid:clipToPadding = "false"およびAndroid:paddingBottom = "65dp"を追加します。製造元のメニューボタンとリサイクラビューセルのアクションを使用している場合。

<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"/>
0
Yogesh Shinde