Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo agregar un efecto de animación de expansión a una vista de lista expandible

Cómo agregar un efecto de animación de expansión a una vista de lista expandible

Solución Enlace de solicitud de extracción de Github:

Android proporciona y expande de forma nativa ListView agrupado: sin embargo, en comparación con UITableView proporcionado de forma nativa en iOS, sus funciones de interfaz de usuario son insuficientes, como no admitir la expansión de animación nativa y el efecto de contracción. .

En la comunidad de código abierto podemos encontrar varias soluciones de animación para Android ExpandableListView. Una de las buenas soluciones es AnimatedExpandableListView de idunnololz. Sus ventajas son: mejor rendimiento, proporcionado como código fuente en lugar de una biblioteca (esto es importante) y claramente comentado.

Sin embargo, cuando las subvistas en el grupo se vuelven complejas, o cuando la estructura principal de ListView se vuelve compleja (por ejemplo, incrustada en otro LinearLayout, FrameLayout o ScrollView), y la estructura principal usa una vista personalizada método onMeasure() (si la estructura principal utiliza un método onMeasure() personalizado y el método está sobrecargado), la optimización del rendimiento está fuera de discusión.

La clave para el uso adecuado de AnimatedExpandableListView es implementar AnimatedExpandableListView#getRealChildView(), que es responsabilidad del desarrollo de la aplicación. En el proyecto real, al optimizar getRealChildView(), el tiempo de inicio del efecto de animación se redujo de 1340 ms a 680 ms (expandiendo un grupo que contiene 5 subelementos). Los problemas encontrados se localizan y resuelven básicamente utilizando el método de seguimiento de métodos proporcionado por Android (android.os.Debug.startMethodTraceing).

La implementación optimizada previamente de getRealChildView() requirió una inicialización de vista extensa ya que no había convertView disponible, mientras que, de hecho, el childView generado durante la fase de dibujo de la animación es completamente reutilizable en convertView y con un tiempo dado. Como puede ver en el perfil de vista de seguimiento a continuación, getChildView() tardó más de un segundo antes de la optimización.

Rendimiento optimizado:

¿Cómo sucede esto? Esto requiere que echemos otro vistazo a cómo se desarrolla la animación, es decir, qué operaciones en getChildView() toman más tiempo. Primero, excluya la influencia de otros factores y concéntrese en el uso de la AnimatedExpandableList recibida inicialmente. Usamos el ejemplo proporcionado de forma nativa por GitHub para el análisis: esta es la expansión del grupo de cinco subelementos. Se generan subelementos, LayoutInflater.inflate se ejecutó 10 veces, el doble que antes. Y inflar lleva bastante tiempo. ¿Hay alguna manera de reducir este consumo de trabajo?

El método consiste en utilizar el caché LRU recomendado por Android para guardar childView. Para obtener más información sobre LruCache, consulte la documentación de referencia y la capacitación de Android. En su propio proyecto, debe pensar detenidamente cómo actualizar el caché cuando cambia el conjunto de datos. Los resultados son los siguientes: el número de inflaciones se reduce a 5 veces y no se pierde tiempo. El tiempo consumido se redujo de 160 ms a 80 ms.