RecycleView item 添加动画滑动过程中动画停止或者消息

RecyclerView滑动时,滑出屏幕的item会从屏幕中移除(Detached),导致mCurrentAnimation对象置空,动画停止。那么当item滑动进屏幕时,不是会执行onBindViewHolder重新设置动画吗?为什么会有一些item重新设置了动画,而有一些item没有重新设置动画呢?
很多人认为RecyclerView的item显示的时候(Attached)就会执行onBindViewHolder绑定数据。其实不然,RecyclerView的四级缓存中,其中有一个mCachedViews列表,缓存的是刚从屏幕移除的ViewHolder(已经Detached),复用这里的ViewHolder不会重新执行onBindViewHolder。也就是说item Detached时动画置空,而Attached时可能不会回调onBindViewHolder重新设置动画。

在item attach的时候重新设置一下动画就可以了 
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
    super.onBindViewHolder(holder, position);
    if (holder.itemView.getTag() != null) {
        holder.itemView.removeOnAttachStateChangeListener((View.OnAttachStateChangeListener) holder.itemView.getTag()); //移除旧的监听器
    }

    View.OnAttachStateChangeListener listener = new View.OnAttachStateChangeListener() {
        @Override
        public void onViewAttachedToWindow(View v) {
            if (holder.getView(R.id.banner_mini_svg) != null) {
                SVGUtils.setSVGAResources("mini_banner.svga", holder.getView(R.id.banner_mini_svg));
            }
        }

        @Override
        public void onViewDetachedFromWindow(View v) {
        }
    };
    holder.itemView.addOnAttachStateChangeListener(listener);
    holder.itemView.setTag(listener); // 保存监听器对象。
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值