[英]Clear Animation in ViewHolder's item RecyclerView
我正在使用RecyclerView並具有一些動畫,在其中我放大了ViewHolder項目中RelativeLayout之一。
注意:它不是添加/刪除/插入動畫。 當用戶在ViewHolder項目中進行交互時開始。 因此,我在這里不使用ItemAnimator。
動畫效果很好,但它會在某些隨機的View項目中重新出現(最終狀態)。 我知道這是由於項目的重復使用造成的,我也正在清除動畫,但這並沒有幫助。
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
Model model = getModelObject(position);
((Model) viewHolder.itemView).showItem(position);
}
我在showItem中這樣做
relativeLayout.clearAnimation();
relativeLayout.setAnimation(null);
在onViewDetachedFromWindow中
@Override
public void onViewDetachedFromWindow(ViewHolder holder) {
((ItemView) holder.itemView).clearAllAnimations();
super.onViewDetachedFromWindow(holder);
}
ClearAllAnimations
public void clearAllAnimations() {
for (RelativeLayout layout : layoutArray) {
optionLayout.clearAnimation();
optionLayout.setAnimation(null);
}
這是我如何為視圖設置動畫
public AnimatorSet onDragStartAnimation(RelativeLayout group[]) {
AnimatorSet big = new AnimatorSet();
for (RelativeLayout relativeLayout : group) {
ObjectAnimator scaleXSmall = ObjectAnimator.ofFloat(relativeLayout, "scaleX", 1.0f, 0.85f);
ObjectAnimator scaleYSmall = ObjectAnimator.ofFloat(relativeLayout, "scaleY", 1.0f, 0.85f);
big.playTogether(scaleXSmall, scaleYSmall);
}
return big;
}
它不起作用。 RelativeLayout不會重置,並且在某些隨機的View Item中顯示為放大狀態。
更新
我做了一個小實驗:像這樣在ViewHolder項目的ImageView上設置alpha動畫
Animation fadeInAnimation = AnimationUtils.loadAnimation(mContext, R.anim.fadein);
imageView.startAnimation(fadeInAnimation);
並使用了清晰的動畫。 imageView.clearAnimation(); 它起作用了,當ViewItem下次出現在屏幕上時,ImageView正常可見。
但是如果我這樣做同樣行不通
alphaAnimator = ObjectAnimator.ofFloat(centerImageView, "alpha", 1.0f, 0.5f);
alphaAnimator.start();
並清除這個
alphaAnimator.removeAllListeners();
alphaAnimator.cancel();
alphaAnimator.end();
這沒有用。 Alpha動畫保留在ViewHolder圖像項中。
我通過在onViewDetachedFromWindow中對所有動畫制作者進行反向動畫來解決它。
@Override
public void onViewDetachedFromWindow(ViewHolder holder) {
if (holder.getItemViewType() == 1) ((MyItemView) holder.itemView).reverseAllAnimations();
}
我以這種方式解決了問題。 一切正常。
GroupsViewHolder-這是自定義RecyclerView.ViewHolder
@Override
public void onViewAttachedToWindow(GroupsViewHolder holder) {
super.onViewAttachedToWindow(holder);
//here add animation
}
@Override
public void onViewDetachedFromWindow(GroupsViewHolder holder) {
//here clear animation
super.onViewDetachedFromWindow(holder);
}
通過從Crymson的答案的 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.