es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Determinar cuándo mostrar la barra de desplazamiento rápida del RecyclerView?

He agregado un fast scroller personalizado para recyclerview en mi aplicación. Pero el problema es que el fast scroller sigue mostrándose aunque el contenido de recyclerview sea muy bajo. ¿Alguien puede sugerirme alguna forma de comprobar inicialmente si recyclerview es desplazable o no? Además, necesito comprobar esto dentro de la propia vista personalizada en lugar de en cualquier actividad/fragmento donde se llama.
Nota: Ya intenté obtener el recyclerview ‘s adapter.Itemcount o recyclerview.computeverticalscrollrange en el método onlayout o onsizechanged de mi vista personalizada, pero inicialmente ambos devuelven 0.
Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución a este problema es anular el método onMeasure() de la vista personalizada del desplazador rápido para verificar si el RecyclerView es o no desplazable. Aquí se muestra un ejemplo de implementación:

    public class CustomFastScroller extends View {
    
        private RecyclerView mRecyclerView;
        private boolean mIsScrollable;
    
        public CustomFastScroller(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public void setRecyclerView(RecyclerView recyclerView) {
            mRecyclerView = recyclerView;
            checkIfScrollable();
        }
    
        private void checkIfScrollable() {
            if (mRecyclerView == null) {
                return;
            }
            int itemCount = mRecyclerView.getAdapter().getItemCount();
            int layoutManagerHeight = mRecyclerView.getLayoutManager().getHeight();
            int verticalScrollRange = mRecyclerView.computeVerticalScrollRange();
            mIsScrollable = itemCount * layoutManagerHeight > verticalScrollRange;
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            if (mRecyclerView != null && !mIsScrollable) {
                setVisibility(View.GONE);
            } else {
                setVisibility(View.VISIBLE);
            }
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    
    }
    

    En esta implementación, primero creamos un método setRecyclerView() que nos permite establecer la instancia de RecyclerView con la que se asociará el desplazador rápido personalizado. Dentro de este método, llamamos a un método auxiliar checkIfScrollable() que calcula si el RecyclerView es o no desplazable en función de su cantidad de elementos, la altura del administrador de diseño y el rango de desplazamiento vertical. Luego almacenamos este resultado de cálculo en una variable booleana mIsScrollable.

    A continuación, anulamos el método onMeasure() de la vista de desplazador rápido personalizada para verificar si mRecyclerView no es nulo y si mIsScrollable es falso. Si ambas condiciones son verdaderas, establecemos la visibilidad de la vista de desplazamiento rápido en GONE, de lo contrario la establecemos en VISIBLE.

    Luego podemos usar esta vista de desplazador rápido personalizada en nuestro archivo de diseño XML de RecyclerView de esta manera:

    <androidx.recyclerview.widget.recyclerview android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"></androidx.recyclerview.widget.recyclerview>
    
    <com.example.customfastscroller android:id="@+id/fast_scroller" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignparentend="true" android:layout_marginend="16dp"></com.example.customfastscroller>
    

    Y establecer la instancia de RecyclerView en nuestra actividad/fragmento de esta manera:

    RecyclerView recyclerView = findViewById(R.id.recycler_view);
    CustomFastScroller fastScroller = findViewById(R.id.fast_scroller);
    fastScroller.setRecyclerView(recyclerView);
    

    De esta manera, podemos asegurarnos de que el desplazador rápido personalizado solo se muestre cuando el RecyclerView realmente necesita ser desplazado.

Comments are closed.