tutorial studio recyclerview personalizado ejemplo crear como cardview card and android scrollbar android-recyclerview fast-scroller

android - studio - recyclerview personalizado



¿Hay una devolución de llamada para cuando RecyclerView haya terminado de mostrar sus artículos después de que lo haya configurado con un adaptador? (2)

Fondo

Creé una biblioteca que muestra un desplazamiento rápido para RecyclerView ( here , en caso de que alguien quiera), y quiero decidir cuándo mostrar y cuándo ocultar el desplazamiento rápido.

Creo que una buena decisión sería que si hay elementos que no se muestran en la pantalla (o hay muchos que no aparecen), después de que el RecyclerView finalizó su proceso de diseño, configuro el desplazamiento rápido para ser visible, y si ya se muestran todos los elementos, no es necesario que se muestre.

El problema

No puedo encontrar un oyente / devolución de llamada para RecyclerView, para decirme cuándo ha terminado de mostrar los elementos, para poder verificar cuántos elementos se muestran en comparación con el recuento de elementos.

El recyclerView también puede cambiar su tamaño cuando el teclado aparece y se oculta.

Lo que he intentado

Es probable que el oyente de desplazamiento no ayude, ya que ocurre "todo el tiempo", y solo necesito verificar cuando el RecyclerView ha cambiado su tamaño o cuando el conteo de elementos (o datos) ha cambiado.

Podría envolver el RecyclerView con un diseño que me notifique los cambios de tamaño, como este que hice, pero no creo que funcione, ya que el RecyclerView probablemente aún no estará listo para indicar cuántos elementos son visibles .

La forma de verificar la cantidad de elementos mostrados se puede usar como tal:

final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(layoutManager); ... Log.d("AppLog", "visible items count:" + (layoutManager.findLastVisibleItemPosition() -layoutManager.findFirstVisibleItemPosition()+1));

La pregunta

¿Cómo me notifican cuando el recyclerView ha terminado de mostrar sus vistas secundarias, para que yo pueda decidir en función de lo que se muestra actualmente, mostrar / ocultar el desplazamiento rápido?


Estoy usando el ''addOnGlobalLayoutListener'' para esto. Por este medio un ejemplo:

Definición de una interfaz para realizar la acción requerida después de la carga:

public interface RecyclerViewReadyCallback { void onLayoutReady(); }

en Reclerview, disparo el método onLayoutReady cuando la carga está lista:

mRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(() -> { if (recyclerViewReadyCallback != null) { recyclerViewReadyCallback.onLayoutReady(); } recyclerViewReadyCallback = null; });

Nota: el conjunto a nulo es necesario para evitar que se llame al método varias veces.


He encontrado una manera de resolver esto (gracias al usuario pskink ), usando la devolución de llamada de LayoutManager:

final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false) { @Override public void onLayoutChildren(final Recycler recycler, final State state) { super.onLayoutChildren(recycler, state); //TODO if the items are filtered, considered hiding the fast scroller here final int firstVisibleItemPosition = findFirstVisibleItemPosition(); if (firstVisibleItemPosition != 0) { // this avoids trying to handle un-needed calls if (firstVisibleItemPosition == -1) //not initialized, or no items shown, so hide fast-scroller mFastScroller.setVisibility(View.GONE); return; } final int lastVisibleItemPosition = findLastVisibleItemPosition(); int itemsShown = lastVisibleItemPosition - firstVisibleItemPosition + 1; //if all items are shown, hide the fast-scroller mFastScroller.setVisibility(mAdapter.getItemCount() > itemsShown ? View.VISIBLE : View.GONE); } };

Lo bueno aquí es que funciona bien y que incluso se mostrará / ocultará el teclado.

Lo malo es que se llama en casos que no son interesantes (lo que significa que tiene falsos positivos), pero no es tan frecuente como los eventos de desplazamiento, por lo que es lo suficientemente bueno para mí.