2013-06-28 15 views
9

Sono bloccato e non sono stato in grado di trovare una soluzione per questo ovunque. :(L'animazione non inizia negli oggetti ListView attualmente visibili

Ho un ImageView dentro il mio layout di ogni elemento del mio ListView (GridView), fornito da un BaseAdapter. quando le immagini vengono caricate e assegnare il BitmapDrawable caricata al ImageView utilizzando

imageView.setImageDrawable(newImage); 

l'articolo apre senza problemi

MA se assegno il nuovo BitmapDrawable utilizzando un TransitionDrawable O assegnando un semplice animazione:.

//this is inoperative - animation will not start for currently displayed items! No solution found :(
Animation a = LibResource.getResourceAnimation(activity, R.anim.fade_in); 
imageView.setImageDrawable(newImage); 
imageView.startAnimation(a); 

L'animazione non verrà avviata per gli OGGETTI VISUALIZZATI CORRELATI del mio GridView. Se scorro il GridView e lo faccio scorrere all'elemento menzionato, l'immagine viene mostrata e l'animazione è stata eseguita!

Ho già provato le seguenti correzioni:

imageView.invalidateDrawable(newImage); 
imageView.invalidate(); 

Ho anche provato le seguenti dichiarazioni dopo l'assegnazione del Animazione - Certo, li ho invitato la UI-thread, dopo l'assegnazione e l'avvio del animazione sul UI-FILO:

myGridView.invalidate(); 
myGridView.invalidateViews(); 
myGridView.getAdapter().notifyDataSetChanged(); 

Come accennato, questo problema si verifica solo per gli elementi visibili nella mia ListView.

Perché l'animazione o TransitionDrawable non si avvia, anche dopo aver invocato invalidate() ecc. Su tutte le viste interessate?

Il problema si verifica sul mio XPeria-Arc-S (livello API 10) e nell'API Android-Level 8,9,10 .. Si tratta di un bug nel sistema Android?

Qualsiasi aiuto sarebbe molto apprezzato!

Grazie in anticipo

Christopher


Ok - Grazie per la risposta rapida.

ho avuto il problema e dopo un sacco di tempo di riorganizzare la mia struttura del codice per far funzionare tutto questo, sono venuto al punto che questo non ha risolto il mio problema :(.

Accanto a questo, non è applicabile o molto pratico per me di cambiare il contenuto nella creazione della vista. Forse avete altre soluzioni per quanto riguarda questo problema?

Sinceramente

Christopher

risposta

6
  1. Indica all'adattatore di animare le visualizzazioni la prossima volta che verrà richiesta la vista.
  2. Chiama invalidateViews().
  3. Quando viene chiamato l'adattatore getView, creare la vista e animarla.
1

Ho risolto questo problema.

Le animazioni iniziali nelle viste per gli oggetti ListView/GridView attualmente visibili non funzionano se si tenta di assegnare questa animazione a un componente di riferimento di questo elemento.

Invece, è necessario invalidare la GridView

myGridView.invalidateViews()

e avviare l'animazione nel secondo

GetView()

metodo BaseAdapter collegato.

Sebbene questo metodo venga richiamato molto spesso dal sistema, in genere si utilizza un meccanismo che memorizza nella cache tutte le visualizzazioni. Pertanto, se si desidera avviare un'animazione in un elemento specifico, è sufficiente ricreare la vista e la volta successiva che il sistema richiama getView() dopo aver chiamato myGridView.invalidateViews(), l'animazione verrà avviata correttamente!

Grazie all'utente che ha rimosso la sua risposta utile.

Saluti Christopher

+1

Piacere di vederlo aiutato, ho annullato la risposta originale. –

+0

Grazie mille! :) Non sono stato in grado di riorganizzare tutto il mio codice immediatamente per fare in modo che tutto funzioni così non è riuscito subito, ma questo è sicuramente il modo corretto di farlo! : D –

0

Ecco come sono stato in grado di risolverlo. La chiave è di notificare il set di dati modificato mediante la pubblicazione nella coda dei messaggi di GridView, in modo che il tuo "notifyDataSetChanged" venga chiamato dopo che tutto ciò che deve fare GridView.

myGridView.post(new Runnable() { 
    public void run() { 
    myGridView.notifyDataSetChanged(); 
    } 
}); 
0

Aggiungere android:animateLayoutChanges="true" in ListView per risolvere il problema.

<ListView 
    android:id="@+id/list_view" 
    android:animateLayoutChanges="true" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 
Problemi correlati