当在Android中滚动视图时,RecyclerView中的项动画停止

3
我有一个Recyclerview,我正在为单个列表项中的视图进行动画处理,但是当我滚动Recyclerview时,动画会停止。这是因为Recyclerview从其视图中删除了项目,所以当我们滚回来时,它会重新获取!但现在我希望即使Recyclerview被滚动并且视图失去焦点并恢复焦点,我启动在Recylerview内部项中的动画也不应该停止!当我从服务器获取数据时,我需要在代码中停止动画!我已经知道在哪里停止动画的代码,如果该项未滚动到视图之外,则可以正常工作! 我的要求很简单,就是即使滚动Recyclerview并且视图失去焦点并恢复焦点,我在Recyclerview内部项中启动的动画也不应该停止!当我从服务器获取数据时,我需要在代码中停止动画!以下是示例代码:

btn.onClick -- 这个按钮是Recyclerview列表项的onClick事件

item 1 btn.startAnimation(anim.xml) -- 启动动画

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

在onSuccess之前,如果我们滚动列表,则动画将停止!请帮忙解决!

我遇到了类似的问题,但 Alexandre Beaulieu 的回答 对我有效。你应该去看看。 - Kuba B
2个回答

0
通过受到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)。 希望这能帮助到某些人。

-3
很难给你一个完整的解决方案,但你尝试过在你正在使用的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
        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接