我有一个Recyclerview,即可在单个列表项目中设置视图动画,但是当我滚动recyclelerview时动画正在停止。因为recyclerview将视图中的项目移除,因此当我们向后滚动它时会将其取回!但现在我希望这个动画继续前进,因为只有当我从服务器获取数据时我才会停止它!
我想要的是我在recylerview内部的各个项目中开始的动画不应该停止,即使滚动了recyclerview并且视图失焦并重新聚焦!当我获得服务器数据时,我需要在代码中停止动画!我有代码停止动画,如果项目没有滚动到视图之外它可以工作!
btn.onClick - 此按钮是recyclelerview列表的onClick item 1 btn.startAnimation(anim.xml) - 启动动画
onSuccess - 服务器返回成功btn.clearAnimation();
但是在onSuccess之前,如果我们滚动列表,动画就会停止!
请帮忙!
答案 0 :(得分:0)
很难为您提供完整的解决方案,但您是否尝试将动画状态保存在您正在使用的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
}
});
答案 1 :(得分: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)。 希望这有助于某人。