欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-04 20:01:36
...

场景:在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销毁的时候需要清理动画。