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

针对RecyclerView中item动画在滑动时出现的停止问题,本文详细介绍了两种解决方案:一是利用View的OnAttachStateChangeListener监听view是否依附在窗口上,动态控制动画的播放;二是采用属性动画,但需注意内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值