Estoy teniendo problemas para entender setHasFixedSize()
. Sé que se usa para la optimización cuando el tamaño de RecyclerView
no cambia, desde los documentos.
Pero, ¿qué significa eso? En los casos más comunes, ListView
casi siempre tiene un tamaño fijo. ¿En qué casos no sería un tamaño fijo? ¿Significa que el espacio real que ocupa en la pantalla crece con el contenido?
android
android-5.0-lollipop
android-recyclerview
SIR Codealot
fuente
fuente
Respuestas:
Una versión muy simplificada de RecyclerView tiene:
Este enlace describe por qué las llamadas
requestLayout
pueden ser costosas. Básicamente, cada vez que se insertan, mueven o eliminan elementos, el tamaño (ancho y alto) de RecyclerView puede cambiar y, a su vez, puede cambiar el tamaño de cualquier otra vista en la jerarquía de vistas. Esto es particularmente problemático si los elementos se agregan o eliminan con frecuencia.Evite pases de diseño innecesarios estableciéndolo
setHasFixedSize
en verdadero cuando cambiar el contenido del adaptador no cambia su altura o el ancho.Actualización: JavaDoc se ha actualizado para describir mejor lo que realmente hace el método.
fuente
requestLayout
o no después de que el conjunto de datos se haya actualizado.Puede confirmar se
setHasFixedSize
relaciona con el RecyclerView en sí, y no con el tamaño de cada elemento adaptado a él.Ahora puede usarlo
android:layout_height="wrap_content"
en un RecyclerView, que, entre otras cosas, permite que CollapsingToolbarLayout sepa que no debe colapsar cuando RecyclerView está vacío. Esto solo funciona cuando se usasetHasFixedSize(false)
en RecylcerView.Si lo usa
setHasFixedSize(true)
en RecyclerView, este comportamiento para evitar el colapso de CollapsingToolbarLayout no funciona, aunque RecyclerView esté vacío.Si
setHasFixedSize
estaba relacionado con el tamaño de los elementos, no debería tener ningún efecto cuando RecyclerView no tiene elementos.fuente
setHasFixedSize(true)
para expandirlos cuando se agregan nuevos elementos.hasFixedSize: set to true if adapter changes cannot affect the size of the RecyclerView.
lo que incluso si el tamaño del elemento cambiará, aún puede establecer esto en verdadero.ListView tenía una función con nombre similar que creo que reflejaba información sobre el tamaño de las alturas de los elementos de la lista individual. La documentación de RecyclerView indica claramente que se refiere al tamaño de RecyclerView en sí, no al tamaño de sus elementos.
Del comentario de la fuente RecyclerView sobre el método setHasFixedSize ():
fuente
Wen fijamos
setHasFixedSize(true)
enRecyclerView
que los medios de tamaño reciclador es fijo y no se ve afectada por el contenido de adaptador. Y en este casoonLayout
no se llama al reciclador cuando actualizamos los datos del adaptador (pero hay una excepción).Vayamos al ejemplo:
RecyclerView
tiene unRecyclerViewDataObserver
( encontrar implementación predeterminada en este archivo ) con varios métodos, el principal importante es:Este método se llama si establecemos
setHasFixedSize(true)
y actualizar los datos de un adaptador a través de:notifyItemRangeChanged, notifyItemRangeInserted, notifyItemRangeRemoved or notifyItemRangeMoved
. En este caso no hay llamadas al recicladoronLayout
, pero hay llamadas arequestLayout
actualizar niños.Pero si configuramos
setHasFixedSize(true)
y actualizamos los datos de un adaptador a través de,notifyItemChanged
entonces hay una llamada alonChange
valor predeterminado del recicladorRecyclerViewDataObserver
y no hay llamadas atriggerUpdateProcessor
. En este caso,onLayout
se llama al reciclador cada vez que configuramossetHasFixedSize
true
ofalse
.Cómo verificar por ti mismo:
Crear personalizado
RecyclerView
y anular:Establezca el tamaño del reciclador en
match_parent
(en xml). Intente actualizar los datos del adaptador usandoreplaceData
yreplaceOne
con setingsetHasFixedSize(true)
y luegofalse
.Y revisa tu registro.
Mi registro:
Resumir:
Si configuramos
setHasFixedSize(true)
y actualizamos los datos del adaptador notificando a un observador de otra manera que no sea la llamadanotifyDataSetChanged
, entonces tiene un poco de rendimiento, porque no hay llamadas alonLayout
método de reciclador .fuente
Si tenemos una
RecyclerView
conmatch_parent
tan alto / ancho , hay que añadirsetHasFixedSize(true)
ya que el tamaño de laRecyclerView
misma no cambia de insertar o eliminar elementos en ella.setHasFixedSize debe ser falsa si tenemos una RecyclerView con
wrap_content
tan alto / ancho ya que cada elemento insertado por el adaptador podría cambiar el tamaño de laRecycler
función de los elementos insertados / borrado, por lo que, el tamaño de laRecycler
que será diferente cada vez que añadir / eliminar artículos.Para ser más claro, si usamos
Nosotros podemos usar
my_recycler_view.setHasFixedSize(true)
Deberíamos usar
my_recycler_view.setHasFixedSize(false)
, esto aplica si también usamoswrap_content
como anchofuente
setHasFixedSize (true) significa que RecyclerView tiene elementos secundarios (elementos) que tienen ancho y alto fijos. Esto permite que RecyclerView se optimice mejor al calcular la altura y el ancho exactos de toda la lista en función de su adaptador.
fuente
Afecta las animaciones de la vista del reciclador, si es
false
... las animaciones de inserción y eliminación no se mostrarán. así que asegúrese de que seatrue
en caso de que haya agregado animación para la vista del reciclador.fuente
Si el tamaño de RecyclerView (el RecyclerView en sí)
... no depende del contenido del adaptador:
... depende del contenido del adaptador:
fuente