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); // 保存监听器对象。
}

你可能感兴趣的:(Android)