Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo implementar el pie de página pegajoso en recyclerview

Tengo RecyclerView y necesito el siguiente comportamiento:

  • Si hay un montón de elementos (más que se ajusta a la pantalla) – pie de página es el último elemento
  • Si pocos elementos / ningún elemento – pie de página se encuentra en la parte inferior de la pantalla

Aconseje cómo puedo implementar este comportamiento.

  • NestedScrolling con NestedScrollView, RecyclerView (Horizontal), dentro de un CoordinatorLayout
  • No se puede llamar a void android.view.View.setTranslationZ (float) en un objeto null
  • Recyclerview exterior no recibe eventos de desplazamiento de Recyclerview interno
  • Android Horizontal Recycler Ver desplazamiento Dirección
  • Buscar a través de RecyclerView usando Searchview
  • NestedScrollView y Horizontal RecyclerView Smooth Scrolling
  • Transición personalizada de elementos compartidos en la actividad final
  • Eliminación del indicador de foco de RecycleView en Android
  • 4 Solutions collect form web for “¿Cómo implementar el pie de página pegajoso en recyclerview”

    Puede utilizar RecyclerView.ItemDecoration para implementar este comportamiento.

    public class StickyFooterItemDecoration extends RecyclerView.ItemDecoration { /** * Top offset to completely hide footer from the screen and therefore avoid noticeable blink during changing position of the footer. */ private static final int OFF_SCREEN_OFFSET = 5000; @Override public void getItemOffsets(Rect outRect, final View view, final RecyclerView parent, RecyclerView.State state) { int adapterItemCount = parent.getAdapter().getItemCount(); if (isFooter(parent, view, adapterItemCount)) { //For the first time, each view doesn't contain any parameters related to its size, //hence we can't calculate the appropriate offset. //In this case, set a big top offset and notify adapter to update footer one more time. //Also, we shouldn't do it if footer became visible after scrolling. if (view.getHeight() == 0 && state.didStructureChange()) { hideFooterAndUpdate(outRect, view, parent); } else { outRect.set(0, calculateTopOffset(parent, view, adapterItemCount), 0, 0); } } } private void hideFooterAndUpdate(Rect outRect, final View footerView, final RecyclerView parent) { outRect.set(0, OFF_SCREEN_OFFSET, 0, 0); footerView.post(new Runnable() { @Override public void run() { parent.getAdapter().notifyDataSetChanged(); } }); } private int calculateTopOffset(RecyclerView parent, View footerView, int itemCount) { int topOffset = parent.getHeight() - visibleChildsHeightWithFooter(parent, footerView, itemCount); return topOffset < 0 ? 0 : topOffset; } private int visibleChildsHeightWithFooter(RecyclerView parent, View footerView, int itemCount) { int totalHeight = 0; //In the case of dynamic content when adding or removing are possible itemCount from the adapter is reliable, //but when the screen can fit fewer items than in adapter, getChildCount() from RecyclerView should be used. int onScreenItemCount = Math.min(parent.getChildCount(), itemCount); for (int i = 0; i < onScreenItemCount - 1; i++) { totalHeight += parent.getChildAt(i).getHeight(); } return totalHeight + footerView.getHeight(); } private boolean isFooter(RecyclerView parent, View view, int itemCount) { return parent.getChildAdapterPosition(view) == itemCount - 1; } } 

    Asegúrese de establecer match_parent para la altura de RecyclerView.

    Por favor, eche un vistazo a la aplicación de ejemplo https://github.com/JohnKuper/recyclerview-sticky-footer y cómo funciona http://sendvid.com/nbpj0806

    Un gran inconveniente de esta solución es que funciona correctamente sólo después de notifyDataSetChanged () en toda una aplicación (no dentro de la decoración). Con notificaciones más específicas no funcionará correctamente y para apoyarlas, requiere una forma más lógica. Además, puede obtener información de la biblioteca recyclerview-stickyheaders por eowise y mejorar esta solución.

    Si no puede olvidarse de RecyclerView y usar ListView, a continuación, consulte este enlace. ¿Existe un equivalente addHeaderView para RecyclerView? Tiene todo lo que necesitas. Se trata de encabezado, pero es prácticamente lo mismo, excepto que el encabezado está en el principio de su lista y el pie de página está al final.

    Sé que esta es una vieja pregunta, pero voy a añadir una respuesta para aquellos que buscarían tal decisión en el futuro. Es POSIBLE mantener último artículo en la parte inferior de la pantalla en caso de que usted tenga solamente pocos o ningunos artículos y haga el artículo pasado para enrollar con el recyclerview cuando usted tiene muchos artículos.

    Cómo lograrlo . Su adaptador de RecyclerView debe aplicar varios tipos de vista: vistas, que deben mostrarse como un elemento de lista; Vista, que debe mostrarse como pie de página; Una vista vacía. Puede comprobar cómo poner elementos con diferentes vistas en el RecyclerView aquí: https://stackoverflow.com/a/29362643/6329995 Localice una vista vacía entre su lista principal y la vista de pie de página. A continuación, en onBindViewHolder para ver la vista vacía, compruebe si las vistas de lista principal y de pie de página toman todas las pantallas. En caso afirmativo, establezca la altura de la vista vacía a cero, de lo contrario, establezca la altura que parece no haber sido tomada por los elementos y el pie de página. Eso es todo. También puede actualizar dinámicamente esa altura cuando elimine / agregue filas. Simplemente llame a notifyItemChanged para su espacio vacío después de actualizar la lista.

    También debe establecer su altura de RecyclerView a match_parent o altura exacta, NO wrap_content!

    Espero que esto ayude.

    Estoy usando un Linearlayout con pesos. He creado múltiples valores para el pie de página, funciona perfectamente.

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical" <include layout="@layout/header" /> <android.support.v7.widget.RecyclerView android:id="@+id/recycleView" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="0.5" tools:layout_height="0dp" tools:listitem="@layout/row" /> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="@dimen/footer_weight" android:padding="@dimen/extra_padding" android:paddingEnd="@dimen/small_padding" android:paddingLeft="@dimen/small_padding" android:paddingRight="@dimen/small_padding" android:paddingStart="@dimen/small_padding" android:text="@string/contact" android:textColor="@color/grey" /> </LinearLayout> 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.