2010-03-05 10 views
29

¿Es posible aplicar una animación de expansión o contracción para expandibleListView?Animación para expandibleListView

+0

No creo que sea posible hacer que la brecha entre las filas sea animada, aunque puse la animación de diapositiva izquierda/derecha en la vista que muestro cuando era niño. Esto solo funciona porque solo hay un solo hijo. – skorulis

Respuesta

10

Se puede hacer utilizando un simple ListView que contiene una vista inicialmente oculta y una clase personalizada que amplía la animación. La idea básica es comenzar con View.GONE y volver a dimensionar gradualmente el margen desde un valor negativo al tamaño requerido mientras se establece la visibilidad en View.VISIBLE.

Ver:

..y finalmente

El último ejemplo contiene todo el código que necesita. Me parece un poco hackish, especialmente el hecho de que inicialmente debe establecer view.bottomMargin = -50 o más, de lo contrario la animación no funciona correctamente la primera vez, pero hasta ahora no encontré ninguna alternativa viable (aparte de utilizar un ScrollView con su propio artículos de contenedor en lugar de un ListView).

Y, por último, esta aplicación incluye el ejemplo anterior, entre muchos otros ejemplos útiles con enlaces a las fuentes:

Actualización: Google retira la aplicación desde la tienda de juego supuestamente por intelectual violación de la propiedad (aunque solo contenía demostraciones y enlaces a proyectos de código abierto), el autor ahora puso la aplicación disponible para descarga directa en http://goo.gl/ihcgs Para obtener más información, consulte https://plus.google.com/108176685096570584154/posts. NB: No estoy afiliado con el autor.

+0

Gracias por el enlace de la aplicación ui patterns. – howettl

+0

pero esto perderá todo el sentido de usar una vista de lista, ya que todos los elementos dentro del grupo (que expande) deben estar dentro de ella. si tienes muchos elementos allí, necesitarás tener muchas vistas para crear allí también ... –

+0

@desarrollador Android: es mejor que utilices ScrollView, lo llenes con vistas y les apliques animaciones como necesario. Un ListView es un componente complejo que está optimizado para grandes listas; si solo tiene hasta una docena de elementos, una vista de desplazamiento podría ser más fácil de animar: haga su propio componente de bloque y anime las vistas dentro de él como desee. La principal desventaja en comparación con un ListView es que Android no creará/destruirá tus elementos a medida que se desplazan dentro y fuera del área de visualización, y que los contenedores no se volverán a usar, pero si tienes algunos artículos, no es un gran problema. . – ccpizza

1

He hecho un trabajo similar para una simple vista de lista. Para hacer eso superé el método getView y aplique la animación hacia arriba (o hacia abajo) en cada elemento de la lista. El grado de traducción fue decidido por la posición de la lista ít.

+0

https://github.com/idunnololz/AnimatedExpandableListView/ –

1

He encontrado una solución posible (parcial) para este problema.

Lo primero que necesita para almacenar el estado de desplazamiento del ExpnadableListView:

@Override 
public void onScrollStateChanged(final AbsListView view, final int scrollState) { 
    this.mScrollState = scrollState; 
} 

public int getScrollState() { 
    return this.mScrollState; 
} 

para la propia vista de lista, es necesario almacenar qué grupo se ha hecho clic, por lo que no harán más que animada sus hijos:

mListView.setOnGroupClickListener(... 
@Override 
public boolean onGroupClick(...){ 
mGroupPosition=groupPosition; 

ahora, en el método getChildView(), comprobar el estado del movimiento en sentido vertical, y si está inactivo, se empieza la animación, por ejemplo:

public View getChildView(...) { 
// <=prepare rootView and return it later 
if (groupPosition==mGroupPosition&&getScrollState() == OnScrollListener.SCROLL_STATE_IDLE) 
    rootView.setAnimation(...) 

esto configurará una animación para las vistas secundarias cada vez que expanda el grupo.

el inconveniente de esto son:

  1. sólo por las vistas secundarios desplegados. Tendrá que pensar en una lógica extra para animarlos al colapsar el grupo.
  2. todas las animaciones comienzan a la vez. necesitarás agregar múltiples animaciones una tras otra si deseas que funcione de otra manera.
+0

Este es un enfoque interesante. Pero, por lo que he aprendido, los elementos * hijos * no son vistas * infantiles *, sino hermanos. Entonces, animas a todos los niños con animaciones separadas, o exactamente cómo lo haces ? Código de ejemplo de trabajo? – Nilzor

+0

@Nilzor Lo he hecho hace mucho tiempo, y el requisito de animaciones se eliminó debido al poco tiempo que tuve que trabajar en él. Lo siento. –

+0

No hay problema, gracias por volver a consultarme. Para cualquier otra persona, el problema aún no se ha resuelto, aunque siento que debería ser Google quien resuelva este problema si toman en serio las directrices de diseño de materiales – Nilzor

Cuestiones relacionadas