Obtenga elementos visibles en RecyclerView

Necesito saber qué elementos se muestran actualmente en mi RecyclerView. No hay equivalente al método OnScrollListener.onScroll(...) en ListViews. Traté de trabajar con View.getGlobalVisibleRect(...) , pero ese truco es demasiado feo y no siempre funciona.

Alguien alguna idea?

El primer / último hijo visible depende del LayoutManager . Si está utilizando LinearLayoutManager o GridLayoutManager , puede usar

 int findFirstVisibleItemPosition(); int findFirstCompletelyVisibleItemPosition(); int findLastVisibleItemPosition(); int findLastCompletelyVisibleItemPosition(); 

Por ejemplo:

 GridLayoutManager layoutManager = ((GridLayoutManager)mRecyclerView.getLayoutManager()); int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 

Para LinearLayoutManager , primero / último depende del pedido del adaptador. No consulte niños desde RecyclerView ; LayoutManager puede preferir diseñar más elementos que los visibles para el almacenamiento en caché.

Finalmente, fundé una solución para saber si el elemento actual es visible, desde el evento onBindViewHolder en el adaptador.

La clave es el método isViewPartiallyVisible de LayoutManager.

En su adaptador, puede obtener LayoutManager desde recyclerView, que puede obtener desde el evento onAttachedToRecyclerView.

Puede usar recyclerView.getChildAt() para obtener cada elemento secundario visible, y establecer alguna etiqueta convertview.setTag(index) en estas vistas en el código del adaptador lo ayudará a relacionarlo con los datos del adaptador.

Para StaggeredGridLayoutManager haz esto:

 RecyclerView rv = findViewById(...); StaggeredGridLayoutManager lm = new StaggeredGridLayoutManager(...); rv.setLayoutManager(lm); 

Y para obtener vistas de elementos visibles:

 int[] viewsIds = lm.findFirstCompletelyVisibleItemPositions(null); ViewHolder firstViewHolder = rvPlantios.findViewHolderForLayoutPosition(viewsIds[0]); View itemView = viewHolder.itemView; 

Recuerde verificar si está vacío.