web-dev-qa-db-fra.com

Ajoutez de l'espace à la fin de RecyclerView

J'ai une vue d'ensemble du recyclage avec un maillage. Ce que je veux, c'est que lorsque l'utilisateur défile à la fin de la liste ( voir ma mauvaise maquette ), il devrait y avoir un espace vide d'une hauteur de 50dp, ce qui n'est pas les mêmes dimensions que ma grille .

Notez que cet espace n'est visible qu'à la toute fin, car je ne veux pas modifier la disposition. Je pourrais faire en sorte que la vue d'ensemble ait une marge inférieure à 50dp, mais je ne veux pas le faire.

<?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

Ceci est mieux réalisé avec un décoration d'article .

Voici un exemple qui fonctionne avec un LinearLayoutManager - vous devrez vous adapter à votre disposition de grille. Ce qu'il fait, c'est de vérifier chaque élément pour voir s'il est le dernier, et s'il l'est, il ajoute le décalage au bas de celui-ci. Pour une disposition en grille, la partie difficile consiste à déterminer si la position de votre article est dans la dernière ligne ou non.

// 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);
        }

    }
}

Pour un GridLayoutManager, à l'intérieur de la méthode getItemOffsets, vous pouvez faire quelque chose de similaire pour déterminer s'il s'agit de la dernière ligne:

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

Vous pouvez essayer le code ci-dessous, n'oubliez pas "Je ne teste pas ce code"

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

et en mise en page:

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