繁体   English   中英

滚动视图android时,项目动画停止在recyclerview中

[英]Item animation stopping in recyclerview when scrolled off the view android

我有一个Recyclerview,即可在单个列表项目中设置动画,但是当我滚动recyclelerview时动画正在停止。 因为recyclerview将视图中的项目移除,因此当我们向后滚动它时会将其取回! 但现在我希望这个动画继续前进,因为只有当我从服务器获取数据时我才会停止它!

我想要的是我在recylerview内部的各个项目中开始的动画不应该停止,即使滚动了recyclerview并且视图没有聚焦并重新聚焦! 当我获得服务器数据时,我需要在代码中停止动画! 我有代码停止动画,如果项目没有滚动视图,它的作用!

btn.onClick - 此按钮是回收站视图列表项的onClick 1 btn.startAnimation(anim.xml) - 启动动画

onSuccess - 服务器返回成功btn.clearAnimation();

但是在onSuccess之前,如果我们滚动列表,动画就会停止!

请帮忙!

很难给你一个完整的解决方案,但你试过在你正在使用的ViewHolder中保存动画状态吗? 我建议在您定义的ViewHolder类中保存一个布尔标志,如isAnimating ,它最初设置为false,在onBindViewHolder(...)方法中你可以做类似的事情。

if (viewHolder.isAnimating) {
    // start animation
} else {
    // clear animation 
}

viewHolder.btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            viewHolder.isAnimating = true;
            // start animation
        }
    });

通过启发来自crymson的答案,我使用View的标签方法,而不是在自定义适配器的复杂逻辑中设置布尔值,我做了一些简单而有用的解决方案。

@Override
public void onViewDetachedFromWindow(RecyclerView.ViewHolder holder) {
    super.onViewDetachedFromWindow(holder);
    if (holder.getItemViewType() == TYPE_AD)
        ((ViewHolderForAd) holder).ivStory.setTag(false);
}


public class ViewHolderForAd extends RecyclerView.ViewHolder {
        private ImageView ivStory;
        TextView tvName;

    public ViewHolderForAd(View view) {
        super(view);
        ivStory = (ImageView) view.findViewById(R.id.ivStoryImage);
        tvName = (TextView) view.findViewById(R.id.tvAppName);
        view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                int pos = getAdapterPosition();
                if (pos < 0) {
                    pos = (int) v.getTag();
                }
                customItemClickListener.onItemClicked(v, pos);
            }
        });

       //ivStory.startAnimation(AnimationUtils.loadAnimation(context, R.anim.pulse_story));
        ivStory.setTag(false); //Set default tag false to decrease risk of null
    }
}

 @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
//...Your code...
if (!(boolean) holder1.ivStory.getTag()) {
     holder1.ivStory.setTag(true);
     holder1.ivStory.startAnimation(AnimationUtils.loadAnimation(context, R.anim.pulse_story));
}
//...Your code...//
}

如果已经在imageView中标记了某些内容(如位置),则可以使用setTag(key,object)而不是setTag(object)。 希望这有助于某人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM