web-dev-qa-db-ja.com

RecyclerViewの最後にスペースを追加します

Gridlayoutを使用したrecyclerviewがあります。私が欲しいのは、ユーザーがリストの最後までスクロールするときです( 私の悪いモックアップを参照してください )、50dpの高さの空のスペースがあるはずです、これは私のグリッドと同じ寸法ではありません。

このスペースは、レイアウトを変更したくないので、最後の端でのみ表示されることに注意してください。 recycerviewのマージンの底が50dpになるようにできましたが、それはしたくありません。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:fab="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Android.support.v7.widget.RecyclerView
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:tools="http://schemas.Android.com/tools"
        Android:id="@+id/recyclerView"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        tools:context=".MainActivity"
        Android:scrollbars="vertical"
        />

</RelativeLayout>
35
HaloMediaz

これは、 アイテムの装飾 で最もよく達成されます。

LinearLayoutManagerで動作する例を次に示します-グリッドレイアウトに合わせて調整する必要があります。各アイテムをチェックして、最後のアイテムかどうかを確認し、最後のアイテムにオフセットを追加します。グリッドレイアウトの場合、難しいのは、アイテムの位置が最後の行にあるかどうかを判断することです。

// After setting layout manager, adapter, etc...
float offsetPx = getResources().getDimension(R.dimen.bottom_offset_dp);
BottomOffsetDecoration bottomOffsetDecoration = new BottomOffsetDecoration((int) offsetPx);
mRecyclerView.addItemDecoration(bottomOffsetDecoration);

...

static class BottomOffsetDecoration extends RecyclerView.ItemDecoration {
    private int mBottomOffset;

    public BottomOffsetDecoration(int bottomOffset) {
        mBottomOffset = bottomOffset;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        int dataSize = state.getItemCount();
        int position = parent.getChildAdapterPosition(view);
        if (dataSize > 0 && position == dataSize - 1) {
            outRect.set(0, 0, 0, mBottomOffset);
        } else {
            outRect.set(0, 0, 0, 0);
        }

    }
}

GridLayoutManagerの場合、getItemOffsetsメソッド内で、これと同様の操作を実行して、最後の行かどうかを判断できます。

GridLayoutManager grid = (GridLayoutManager)parent.getLayoutManager();
if ((dataSize - position) <= grid.getSpanCount()) {
    outRect.set(0, 0, 0, mBottomOffset);
} else {
    outRect.set(0, 0, 0, 0);
}
39
Adam S
<RecyclerView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:paddingBottom="50dp"
    Android:clipToPadding="false"
    />
125
mbmc

以下のコードを試すことができます。「このコードはテストしません」

public class MyRecyclerView extends RecyclerView {
    private Context context;
    public MyRecyclerView(Context context) {
        super(context);
        this.context = context;

    }

    public MyRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    public MyRecyclerView(Context context, AttributeSet attrs, int defStyle)     {
        super(context, attrs, defStyle);
        this.context = context;
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        View view = (View) getChildAt(getChildCount()-1);
        int diff = (view.getBottom()-(getHeight()+getScrollY()+view.getTop()));
        if( diff == 0 ){  // if diff is zero, then the bottom has been reached
            TextView tv = new TextView(context);
            tv.setHeight(dpToPx(50));
            addView(tv,getChildCount());//update --> add to last
            requestLayout();
        }
        super.onScrollChanged(l, t, oldl, oldt);
    }
    public int dpToPx(int dp) {
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
        return px;
    }
}

およびレイアウト:

<your_packagae.MyRecyclerView
    Android:id="@+id/recyclerView"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:scrollbars="vertical"
    />
0
Robust