studio recyclerview manager implement gridlayout example ejemplo cardview android android-layout android-recyclerview android-gridlayout

android - manager - Agrega espacio al final de RecyclerView



gridlayoutmanager spacing (3)

Tengo un recyclerview con un gridlayout. Lo que quiero es que cuando el usuario se desplace hasta el final de la lista ( vea mi maqueta incorrecta ), debería haber un espacio vacío con una altura de 50dp, que no tenga las mismas dimensiones que mi cuadrícula.

Tenga en cuenta que este espacio solo es visible al final, ya que no quiero cambiar el diseño. Podría hacerlo para que el reciclaje tenga un margen inferior de 50dp, pero no quiero hacer eso.

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


Esto se logra mejor con un elemento de decoración .

Este es un ejemplo que funciona con un LinearLayoutManager : tendrá que ajustarse para adaptarse a su diseño de cuadrícula. Lo que hace es verificar cada elemento para ver si es el último, y si lo es, agrega el desplazamiento a la parte inferior. Para un diseño de cuadrícula, la parte difícil es averiguar si la posición de su elemento está en la última fila o no.

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

Para un GridLayoutManager , dentro del método getItemOffsets , podría hacer algo similar a esto para averiguar si es la última fila:

GridLayoutManager grid = (GridLayoutManager)parent.getLayoutManager(); if ((dataSize - position) <= grid.getSpanCount()) { outRect.set(0, 0, 0, mBottomOffset); } else { outRect.set(0, 0, 0, 0); }


Puede probar el siguiente código, recuerde "No pruebo este código"

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

y en el diseño:

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


<RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="50dp" android:clipToPadding="false" />