0

Préface
Je souhaite implémenter une animation de téléchargement dans RecyclerView. Dans onBindViewHolder et onViewRecycled Je m'abonne et me désinscrit du présentateur qui récupère le pourcentage de fichier déjà téléchargé. Je commence l'animation:Animation vectorielle dans RecyclerView

 AnimatedVectorDrawableCompat drawable = AnimatedVectorDrawableCompat.create(context, R.drawable.download_animated); 
     if (drawable != null) { 
      holder.downloadingIcon.setImageDrawable(drawable); 
      drawable.start(); 
     } 

Problème
J'ai onViewRecycled invoquaient juste après l'animation est terminée avec un suivi stacktrace:

java.lang.RuntimeException 
at EventRecyclerViewAdapter.onViewRecycled(EventRecyclerViewAdapter.java:271) 
at android.support.v7.widget.RecyclerView$Recycler.dispatchViewRecycled(RecyclerView.java:6064) 
at android.support.v7.widget.RecyclerView$Recycler.addViewHolderToRecycledViewPool(RecyclerView.java:5835) 
at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:5800) 
at android.support.v7.widget.RecyclerView.removeAnimatingView(RecyclerView.java:1305) 
at android.support.v7.widget.RecyclerView$ItemAnimatorRestoreListener.onAnimationFinished(RecyclerView.java:11775) 
at android.support.v7.widget.RecyclerView$ItemAnimator.dispatchAnimationFinished(RecyclerView.java:12275) 
at android.support.v7.widget.SimpleItemAnimator.dispatchChangeFinished(SimpleItemAnimator.java:304) 
at android.support.v7.widget.DefaultItemAnimator$7.onAnimationEnd(DefaultItemAnimator.java:363) 
at android.support.v4.view.ViewPropertyAnimatorCompatJB$1.onAnimationEnd(ViewPropertyAnimatorCompatJB.java:51) 
at android.view.ViewPropertyAnimator$AnimatorEventListener.onAnimationEnd(ViewPropertyAnimator.java:1121) 
at android.animation.ValueAnimator.endAnimation(ValueAnimator.java:1149) 
at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1309) 
at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:146) 
at android.animation.AnimationHandler.-wrap2(AnimationHandler.java) 
at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:54) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:957) 
at android.view.Choreographer.doCallbacks(Choreographer.java:734) 
at android.view.Choreographer.doFrame(Choreographer.java:667) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:945) 
at android.os.Handler.handleCallback(Handler.java:751) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6776) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

Question
Pourquoi il se comporte comme alors et comment puis-je le réparer?

Répondre

0

Il se trouve, notifyItemChanged causé recycleur ViewHolder précédent si onBindViewHolder et onViewRecycled sont invoquées ... mais sur des instances différentes. Tout d'abord, onBindViewHolder est appelé avec nouvelle instance ViewHolder. Suivant onViewRecycled est appelé avec le ancien ViewHolder.
Dans mon cas, le problème ne reposait que sur un id du modèle. Il ne décrit pas sans ambiguïté la vue du présentateur que j'avais l'habitude de notifier à propos des mises à jour.