0

Vorwort
Ich möchte eine Download-Animation in RecyclerView implementieren. In onBindViewHolder und onViewRecycled Ich abonniere und Abbestellen von Presenter, die den Prozentsatz der bereits heruntergeladenen Datei abruft. Ich fange Animation:Vektor-Animation in RecyclerView

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

Problem
Ich habe haben onViewRecycled aufgerufen rechts, nachdem die Animation mit Follow Stacktrace ist beendet:

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) 

Frage
Warum verhält es sich wie So und wie kann ich es beheben?

Antwort

0

Es stellt sich heraus, notifyItemChanged verursacht vorherigen ViewHolder Recycler so onBindViewHolder und onViewRecycled aufgerufen werden ... aber auf verschiedenen Instanzen. Zuerst wird onBindViewHolder mit neue ViewHolder-Instanz aufgerufen. Weiter onViewRecycled wird mit dem alten ViewHolder aufgerufen.
In meinem Fall beruhte das Problem nur auf einem id des Modells. Es beschreibt nicht eindeutig Presenter's View Ich habe über Updates informiert.