RecyclerView LayoutManager findViewByPosition devuelve null
Estoy interesado en cuál es el momento correcto y el primero posible para obtener el tamaño del primer elemento de RecyclerView?
He intentado utilizar:
- Centrar verticalmente el elemento seleccionado en RecyclerView
- RecyclerView muestra los datos eliminados en la lista
- RecyclerView se desplaza al final después de smoothScrollToPosition (0)
- Refrescar datos en RecyclerView y mantener su posición de desplazamiento
- Cómo resaltar correctamente el elemento seleccionado en RecyclerView?
recyclerView.setLayoutManager(new GridLayoutManager(context, 2)); recyclerView.setAdapter(new MyDymmyGridRecyclerAdapter(context)); recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { recyclerView.getViewTreeObserver().removeGlobalOnLayoutListener(this); View firstRecyclerViewItem = recyclerView.getLayoutManager().findViewByPosition(0); // firstRecyclerViewItem is null here } });
Pero devuelve null en este momento.
- ¿Cómo realizar un seguimiento de los elementos seleccionados en un RecyclerView en Android?
- Dos RecyclerViews uno bajo el otro en un diseño
- La barra de desplazamiento de RecyclerView salta de nuevo al principio después del primer elemento
- Recyclerview Sin adaptador conectado; Saltar el diseño
- RecyclerView - saltar a la posición, luego desplazamiento suave hasta la parte superior
- Seleccione elementos en RecyclerView
- ¿Cómo obtener la vista de niño de RecyclerView?
- ¿Cuál es el equivalente listview.setSelection en caso de Recycler View
Si está usando OnGlobalLayoutListener
debe recordar que onGlobalLayout
se puede llamar varias veces. Algunas de esas llamadas pueden suceder incluso antes de que Layout
esté listo (y por pronto me refiero al momento en que puede obtener las dimensiones de una View
llamando a view.getHeight()
o view.getWidth()
). Así que la forma correcta de implementar su enfoque sería:
recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int width = recyclerView.getWidth(); int height = recyclerView.getHeight(); if (width > 0 && height > 0) { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { recyclerView.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } View firstRecyclerViewItem = recyclerView.getLayoutManager().findViewByPosition(0); } });
Aparte de eso, usted todavía necesita estar seguro de que en el momento de findViewByPosition(0)
llamar:
- El
Adapter
RecyclerView's
tiene al menos un elemento de datos. -
View
en la posición0
está visible enRecyclerView
Dime si eso arregla tu problema, si no hay todavía otra manera de hacer lo que necesitas.
En mi RecyclerView
extendido onChildAttachedToWindow
como esto
@Override public void onChildAttachedToWindow(View child) { super.onChildAttachedToWindow(child); if (!mIsChildHeightSet) { // only need height of one child as they are all the same height child.measure(0, 0); // do stuff with child.getMeasuredHeight() mIsChildHeightSet = true; } }
Tuve este tipo de problema. Quiero realizar un clic por defecto en la primera posición visible de la recylerview. Escribí el código para que en onResume pero no funcionó. He resuelto mi problema escribiendo el código en el método onWindowFocusChanged
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if(isCalledForTheFirstTime) { LinearLayoutManager manager= (LinearLayoutManager) rcViewHeader.getLayoutManager(); int pos= manager.findFirstCompletelyVisibleItemPosition(); View view=manager.findViewByPosition(pos); if(view!=null) { view.performClick(); } // change the vaule so that it would not be call in case a pop up appear or disappear isCalledForTheFirstTime=false; } }
- Protección de las claves de twitter en Android
- Los anuncios de Google con varios tamaños de anuncio de DFP dan error