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