RecyclerView的Item复用导致动画不执行问题

Posted 陳英傑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RecyclerView的Item复用导致动画不执行问题相关的知识,希望对你有一定的参考价值。

场景:在RecyclerView的item中的某个控件在状态0时执行动画,其他状态下不执行。

实现方式:判断状态0时给view设置动画,我采用补间动画。

问题:在滑动的时候,划到下面再滑倒上面,上面刚才执行的动画不动了,这是由于itemView在离开屏幕的时候,view自身会把它的动画置空。

那么我们就可以考虑在view依附在窗口的时候执行动画:

@Override
public void onBindViewHolder(@NonNull TaskHolder holder, int position) 
	if (holder.timerView.getTag() instanceof View.OnAttachStateChangeListener) 
    	holder.timerView.removeOnAttachStateChangeListener((View.OnAttachStateChangeListener) holder.timerView.getTag());
    
    View.OnAttachStateChangeListener attachListener = new View.OnAttachStateChangeListener() 
	    @Override
	    public void onViewAttachedToWindow(View v) 
	    	// 注意,需要在这里面判断状态,不能先判断状态再设置监听。
	        if (status == 0) 
	            holder.timerView.setAnimation(animation);
	         else // 其他状态清除动画
	            holder.timerView.clearAnimation();
	        
	    

        @Override
        public void onViewDetachedFromWindow(View v) 

        
    ;
    holder.timerView.addOnAttachStateChangeListener(attachListener);
    holder.timerView.setTag(attachListener);

还有一种解决方式,使用属性动画,但是需要注意内存泄漏,在view销毁的时候需要清理动画。

以上是关于RecyclerView的Item复用导致动画不执行问题的主要内容,如果未能解决你的问题,请参考以下文章

RecyclerView.ItemAnimator实现动画效果

ListView和RecyclerView复用详解

RecyclerView中 item进行放大动画被父布局覆盖

RecyclerView中 item进行放大动画被父布局覆盖

RecyclerView — DiffUtil

Checkbox的RecyclerView单选,多选问题