Android ExpandableListView con animación

Estoy usando

<ExpandableListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" > </ExpandableListView> 

Quiero añadir animación diapositiva para el niño cuando onclick padre. Entonces, ¿cómo puedo hacer?

Actualización final

Ha pasado bastante tiempo desde que escribí esta respuesta. Desde entonces, mucho ha cambiado. El mayor cambio es con la introducción de RecyclerView que facilita la animación de una lista o una cuadrícula. Recomiendo encarecidamente cambiar a RecyclerView s si puedes. Para aquellos que no pueden ver lo que puedo hacer con respecto a la fijación de los errores para mi biblioteca.


Respuesta original

En realidad no me gusta la implementación popular de un ExpandableListView animado que simplemente utiliza un ListView con una animación de expansión porque en mi caso de uso, cada uno de mis grupos tenía muchos hijos, por lo tanto, no era factible usar un ListView normal como el niño Las vistas no se reciclarán y el uso de memoria será enorme con un rendimiento deficiente. En su lugar, fui con un enfoque mucho más difícil pero más escalable y flexible.

He extendido la clase ExpandableListView y sobreproducido las funciones onCollapse y onExpand, también he creado una subclase de un BaseExpandableListAdapter llamado AnimatedExpandableListAdapter. En el interior del adaptador, anulaba la función getChildView y hacía que la función fuera definitiva para que la función no pudiera ser superada nuevamente. En su lugar, proporcioné otra función llamada getRealChildView para que las subclases reemplazaran para proporcionar una vista secundaria real. A continuación, agregó un indicador de animación a la clase e hizo getChildView devolver una vista ficticia si el indicador de animación se estableció y la vista real si el indicador no se estableció. Ahora, con el conjunto de escenarios, hago lo siguiente para onExpand:

  1. Establezca el indicador de animación en el adaptador y dígale al adaptador qué grupo se está expandiendo.
  2. Llame a notifyDataSetChanged() (obliga al adaptador a llamar a getChildView() para todas las vistas en la pantalla).
  3. El adaptador (en el modo de animación) creará una vista ficticia para el grupo en expansión que tiene la altura inicial 0. El adaptador obtendrá las vistas secundarias reales y pasará estas vistas a la vista ficticia.
  4. La vista ficticia entonces comenzará a dibujar las vistas reales del niño dentro de su propia función onDraw() .
  5. El adaptador iniciará un bucle de animación que ampliará la vista ficticia hasta que tenga el tamaño correcto. También establecerá un detector de animación para que pueda borrar el indicador de animación una vez que la animación se complete y llamará notifyDataSetChanged() también.

Finalmente con todo esto hecho, no sólo pude obtener el efecto de animación deseado, sino también el rendimiento deseado, ya que este método funcionará con grupos con más de 100 niños.

Para la animación de colapso, un poco más de trabajo se necesita hacer para obtener todo esto de instalación y funcionamiento. En particular, cuando reemplaza onCollapse, no desea llamar a la función de los padres ya que hará que el grupo se colapse inmediatamente, dejándole sin posibilidad de reproducir una animación. En su lugar, desea llamar a super.onCollapse al final de la animación de contracción.

ACTUALIZAR:

Pasé algún tiempo este fin de semana para reescribir mi implementación de este AnimatedExpandableListView y estoy liberando el código fuente con un ejemplo de uso aquí: https://github.com/idunnololz/AnimatedExpandableListView/

@idunnololz solución funciona muy bien. Sin embargo, me gustaría añadir algún código para colapsar previamente expandido grupo.

 private int previousGroup=-1; listView.setOnGroupClickListener(new OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { // We call collapseGroupWithAnimation(int) and // expandGroupWithAnimation(int) to animate group // expansion/collapse. if (listView.isGroupExpanded(groupPosition)) { listView.collapseGroupWithAnimation(groupPosition); previousGroup=-1; } else { listView.expandGroupWithAnimation(groupPosition); if(previousGroup!=-1){ listView.collapseGroupWithAnimation(previousGroup); } previousGroup=groupPosition; } return true; } }); 
 animateLayoutChanges adds auto-animation <ExpandableListView android:animateLayoutChanges="true" android:layout_width="fill_parent" android:layout_height="fill_parent"/> 

@idunnololz solución está funcionando muy bien, pero he experimentado un comportamiento extraño con mi diseño personalizado para el grupo. La operación de expansión no se ejecutó correctamente, sin embargo el colapso funcionó perfecto. Importé su proyecto de prueba y funcionó muy bien, así que me di cuenta de que el problema es con mi diseño personalizado. Sin embargo, cuando no pude localizar el problema después de alguna investigación, decidí descomentar estas líneas de código en su AnimatedExpandListView:

  if (lastGroup && Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { return expandGroup(groupPos, true); } 

Que causó el problema (mi aplicación está destinada a Android 4.0 o superior).

  • ExpandableListView expandir sólo en un botón específico?
  • El divisor de Android ExpandableListView es invisible
  • Lista de visualización de Android usando expandibleListView
  • Android: ¿Hay una manera de animar tanto el grupo como el listview de un ExpandableListView?
  • Comportamiento del selector de lista expandible de Android
  • GridView dentro de ExpandableListView con múltiples opciones en Android
  • Guardar y restaurar el estado expandido / colapsado de un ExpandableListActivity
  • Implementar ListView expandible con adaptador personalizado
  • Expandir elemento ListView con animación
  • Animar a los niños de una lista expandible cuando se colapsan / expanden
  • Cómo llamar a notifyDataSetChanged para Custom ExpandableListView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.