Cómo obtener la altura del elemento recyclerview en "onBindViewHolder"

La altura del elemento de RecyclerView no es fija , necesito fijar la imagen de fondo para cada artículo, así que quiero conseguir la altura del elemento de recyclerview para cambiar el tamaño de la imagen, pero el itemView.getHeight() devuelve siempre 0 en onBindViewHolder .

He intentado buscar muchas preguntas o artículos, pero todavía no puedo conseguir una buena solución.

2 Solutions collect form web for “Cómo obtener la altura del elemento recyclerview en "onBindViewHolder"”

Corto

Mida la vista manualmente

 view.measure( View.MeasureSpec.makeMeasureSpec(recyclerViewWidth, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 

Y obtener la altura con view.getMeasuredHeight()

Fondo

Una vista devolverá un valor válido para View.getHeight() sólo después de haber sido medido. La medición en sí ocurrirá automáticamente por el sistema cuando la vista esté a punto de aparecer en la pantalla.

Cuando Android quiere mostrar el diseño, llamará recursivamente a la función view.layout() para cada vista del árbol de vistas. Cada padre le dice a sus hijos las restricciones que pueden tener (ancho / alto) y pídales que view.measure() ellos mismos. Como resultado, la vista almacenará los valores medidos BASADOS en las restricciones en los miembros designados (MedidoHay / Ancho). Tenga en cuenta que en este punto view.getMeasuredHeight() mantendrá el valor mientras view.getHeight() seguirá siendo inválido. view.getHeight() sólo devolverá un valor válido una vez que la vista tenga una altura real en la jerarquía de la interfaz de usuario.

Resumen

Por lo tanto, para conocer la altura de un elemento de vista, antes de que haya sido medida y establecida por el sistema, tendremos que invocar la función view.measure() manualmente.

La función de medida espera 2 parámetros que derivan de la vista LayoutParams + las restricciones de los padres.

En el ejemplo de código anterior, estamos midiendo la vista obligando a que su ancho sea EXACTAMENTE el ancho del padre (el RecycleView), y la altura no está limitada.

Sugiero que defina varios archivos de diseño con las alturas esperadas e infle de acuerdo con algunos criterios en su conjunto de datos.

 VH onCreateViewHolder (ViewGroup parent, int viewType){ if(some condition){ //inflate layout 1 }else{ //inflate layout 2 } 

O como contestado aquí : usted puede conseguir las medidas mientras que inicializa el sostenedor de la visión

 viewHolder.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); int width = viewHolder.getMeasuredWidth(); int height = viewHolder.getMeasuredHeight(); 
  • RecyclerView se desplaza al final después de smoothScrollToPosition (0)
  • Desactivar eventos táctiles de RecyclerView (para evitar toques de usuario)?
  • Desplácese hacia arriba en RecyclerView con LinearLayoutManager
  • Seleccione elementos en RecyclerView
  • Creación de secciones dentro de RecyclerView
  • Lista ampliable con RecyclerView?
  • Android - Cómo detener la recarga de imágenes en Recyclerview al desplazarse
  • RecyclerView desplazado UP / DOWN oyente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.