android - item - recyclerview get child layout position
Obtener elementos visibles en RecyclerView (4)
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 preguntes a los niños de RecyclerView
; LayoutManager
puede preferir diseñar más elementos que los visibles para el almacenamiento en caché.
Necesito saber qué elementos se muestran actualmente en mi RecyclerView. No hay equivalente al método OnScrollListener.onScroll(...)
en ListViews. Intenté trabajar con View.getGlobalVisibleRect(...)
, pero ese hack es demasiado feo y no siempre funciona.
Alguien alguna idea?
Finalmente, encontré una solución para saber si el elemento actual está 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.
Para StaggeredGridLayoutManager
haga 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 comprobar si está vacío.
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 le ayudará a relacionarla con los datos del adaptador.