【问题标题】:Item animation stopping in recyclerview when scrolled off the view android滚动视图android时,项目动画在recyclerview中停止
【发布时间】:2017-08-03 21:19:13
【问题描述】:

我有一个 Recyclerview,我正在为单个列表项中的视图设置动画,但是当我滚动 recyclerview 时,动画正在停止。这是因为 recyclerview 从它的视图中删除了项目,所以当我们向后滚动时它会取回它!但是现在我希望该动画继续播放,因为只有当我从服务器获取数据时我才会停止它!

我想要的只是我在 recyclerview 内的各个项目中启动的动画,即使 recyclerview 滚动并且视图失焦并重新获得焦点,我也不应该停止!我需要在获取服务器数据时停止代码中的动画!我有停止动画的代码,如果项目没有滚动出视图,它就可以工作!

btn.onClick -- 这个按钮是recyclerview列表的onClick item 1 btn.startAnimation(anim.xml) -- 开始动画

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

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

请帮忙!

【问题讨论】:

标签: android animation android-recyclerview


【解决方案1】:

从 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)。 希望这对某人有所帮助。

【讨论】:

    【解决方案2】:

    很难为您提供完整的解决方案,但您是否尝试过将动画状态保存在您正在使用的 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
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多