2014-12-12 21 views
13

I have a RecyclerView. Ciascuno dei suoi elementi della vista del riciclatore può essere espanso o meno. Ci può essere un solo oggetto espanso allo stesso tempo.RecyclerView: Ridimensiona animare elemento

In sostanza, sto cercando di ricreare l'elenco cronologico in lolipop dialier.

Ho trovato che using a LayoutTransition on RecyclerViewmakes it crash.

Ma non sono stato in grado di animare correttamente la modifica della visualizzazione degli articoli tra entrambi gli stati.

Ho provato getItemAnimator().setSupportsChangeAnimations(true) unitamente notifyItemChanged(getPosition()) ma c'è due problemi:

  • La vista è ricreato, rendendo la transizione piuttosto strano come svanisce sopra l'elemento successivo nello stesso tempo come l'oggetto si sta muovendo. La nuova vista che appare non sta ridimensionando, è già a dimensione intera.
  • Mentre la vista viene ricreata, la vecchia visualizzazione viene sfumata mentre il nuovo è in dissolvenza, il che rende lo sfarfallio del colore di sfondo della vista.

Inoltre ho provato a fissare un LayoutTransition nella vista oggetto per tutta la durata dell'animazione, ma il problema con questo approccio è che il layout del RecycleView aggiorna immediatamente e non segue l'animazione.

Ho creato un piccolo progetto dimostrativo di questo problema per entrambi i tentativi. The projects sources are here.

Come posso creare una transizione graduale alla modifica del layout dell'articolo?

+0

Scusa se non ho una risposta per te, ma mi sto occupando dello stesso problema, sei riuscito a farlo funzionare ancora? Ti terrò informato su quello che sono riuscito a fare! –

+0

Sono molto vicino, rimani sintonizzato –

+0

Non sono stato in grado di avvicinarmi ai progetti che ho collegato. In attesa di vedere il tuo lavoro;) –

risposta

11

OK, quindi ho trovato una soluzione che non coinvolge chiamando notifyItemChanged così la vista non viene sostituita. Il motivo è che devi controllare manualmente la consistenza della vista. Per questo, ho creato una piccola libreria che consente esattamente quello che stavo cercando, per 5 loc nel ViewHolder.

Il trucco è di animare manualmente il cambio di altezza piuttosto che utilizzare un LayoutTransition.

The demo project can be found here.

+0

Fondamentalmente non è quello che ho detto e ora ti stai accreditando per questa risposta? –

+1

Non ci credo, ma mi dispiace se senti che ti ho derubato in qualche modo. Questa soluzione non utilizza notifyDataSetChanged e "manualmente" gestisce gli stati delle celle, impedendo lo "scambio di celle". Inoltre, ho messo questo come una risposta e non un commento perché sto fornendo un progetto dimostrativo che illustra come faccio questo. Per favore, pubblica qui la tua risposta con il tuo progetto demo e sarò lieto di accreditarti come risposta :) –

+0

"lp.height = (int) animation.getAnimatedValue(); _view.setLayoutParams (lp);" - Quelle linee, tratte dal progetto demo, sono davvero molto lente per animare qualsiasi cosa. Ho scritto su questo qui e ho proposto soluzioni (non molto orgogliose di) http://stackoverflow.com/questions/12729830/expand-listview-item-with-animation/26612450#26612450 – Deepscorn

0

Si consiglia di utilizzare solo notifyItemChanged(getPosition(), new Object()).

Nell'adattatore, eseguire l'override di onBindViewHolder(GigExtraViewHolder holder, int position, List<Object> payloads), se i payload sono nulli o vuoti esegui le tue logiche di collegamento originali, altrimenti esegui l'animazione di espansione/compressione.

Problemi correlati