Android ExpandableListView usando l'animation

sto usando

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

voglio aggiungere diapositiva animation per il figlio quando genitore onclick. Così come posso fare?

  • File di espansione nella nuova console di sviluppo di Google Play
  • animare i fanciulli di una visualizzazione expandablelist quando si crollano / si espandono
  • Problemi di verifica della libreria di espansione APK
  • Animazione per expandableListView
  • Animazione per expandableListView
  • animare i fanciulli di una visualizzazione expandablelist quando si crollano / si espandono
  • Problemi di verifica della libreria di espansione APK
  • File di espansione nella nuova console di sviluppo di Google Play
  • 4 Solutions collect form web for “Android ExpandableListView usando l'animation”

    Aggiornamento finale

    È passato molto tempo da quando ho scritto questa risposta. Da allora molto è cambiato. Il più grande cambiamento è con l'introduzione di RecyclerView che rende l'animation di un elenco o una griglia facile. Raccommand vivamente di passare a RecyclerView s se è ansible. Per coloro che non riesco a capire cosa posso fare per quanto riguarda la riparazione dei bug per la mia biblioteca.


    Risposta originale

    In realtà non mi piace l'implementazione popolare di un ExpandableListView animato che utilizza semplicemente un ListView con un'animation di espansione perché nel mio caso d'uso, ognuno dei miei gruppi aveva molti bambini, quindi non era ansible utilizzare un normale ListView come il bambino le viste non saranno riciclate e l'utilizzo della memory sarà enorme con scarse performance. Invece, sono andato con un approccio molto più difficile ma più scalabile e flessibile.

    Ho esteso la class ExpandableListView e sovrascritto le funzioni onCollapse e onExpand, ho anche creato una sottoclass di un BaseExpandableListAdapter chiamato AnimatedExpandableListAdapter. All'interno dell'adattatore, ho superato la function getChildView e ha reso la function definitiva in modo che la function non possa essere nuovamente sradicata. Invece ho fornito un'altra function chiamata getRealChildView per le sottoclassi per ignorare per fornire una vera visione infantile. Ho quindi aggiunto una bandiera di animation alla class e fatto che getChildView restituisca una vista fittizia se la bandiera di animation è stata impostata e la visualizzazione reale se la bandiera non è stata impostata. Ora con il set di stage ho il seguente per onExpand:

    1. Impostare la bandiera di animation nell'adattatore e indicare l'adattatore che il gruppo sta espandendo.
    2. Chiamata notifyDataSetChanged() (forza l'adattatore per call getChildView() per tutte le visualizzazioni sullo schermo).
    3. L'adattatore (in modalità animation) creerà quindi una vista fittizia per il gruppo espandente che ha l'altezza iniziale 0. La scheda avrà quindi le viste reali del figlio e passa queste visioni alla vista fittizia.
    4. La vista fittizia inizia quindi a disegnare le viste reali del bambino all'interno della propria function onDraw() .
    5. L'adattatore lancerà un ciclo di animation che espanderà la vista fittizia fino a quando non sia della giusta dimensione. Sarà anche impostato un ascoltatore di animation in modo che possa cancellare la bandiera di animation una volta completata l'animation e chiamerà notifyDataSetChanged() .

    Infine, con tutto questo fatto, ho potuto get non solo l'effetto animato desiderato, ma anche le performance desiderate in quanto questo metodo functionrà con un gruppo con più di 100 bambini.

    Per l'animation crollata, bisogna fare un po 'più di lavoro per get tutto questo in fase di installazione e di esecuzione. In particolare, quando si ignora la function Collapse, non si desidera call la function del padre in quanto comprimerà il gruppo senza lasciare alcuna possibilità di riprodurre un'animation. Invece si desidera call super.onCollapse alla fine dell'animation di crollo.

    AGGIORNARE:

    Ho trascorso un po 'di tempo questo weekend per riscrivere la mia implementazione di questo AnimatedExpandableListView e sto rilasciando la fonte con un esempio di utilizzo qui: https://github.com/idunnololz/AnimatedExpandableListView/

    La soluzione @idunnololz funziona ottimamente. tuttavia vorrei aggiungere un codice per crollare il gruppo precedentemente espanso.

     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"/> 

    La soluzione @idunnololz funziona bene, ma ho provato un comportmento strano con il mio layout personalizzato per il gruppo. L'operazione di espansione non è stata eseguita correttamente, tuttavia il collasso ha funzionato perfettamente. Ho importto il suo progetto di prova e ha funzionato bene, quindi ho capito che il problema è con il mio layout personalizzato. Tuttavia, quando non sono stato in grado di individuare il problema dopo alcune indagini, ho deciso di annullare le seguenti linee di codice nel suo AnimatedExpandListView:

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

    che ha causato il problema (la mia applicazione è rivolta a Android 4.0+).

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.