当前位置: 首页 > 知识库问答 >
问题:

清除视图持有者的项目回收器视图中的动画

公孙芷阳
2023-03-14

我正在使用RecyclerView,并有一些动画,我可以在ViewHolder项目中放大一个相对布局。

注意:它不是添加/删除/插入动画。当用户在 ViewHolder 项中交互时,它将启动。因此,我在这里没有使用ItemAnimator。

动画工作正常,但它会在某个随机视图项中重新出现(最终状态)。我知道这是由于物品的重复使用,我也在清除动画,但这没有帮助。

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
    Model model = getModelObject(position);
    ((Model) viewHolder.itemView).showItem(position);   
}

我在节目里做这个

        relativeLayout.clearAnimation();
        relativeLayout.setAnimation(null);

在onViewDetachedFromWindow中

@Override
public void onViewDetachedFromWindow(ViewHolder holder) {
    ((ItemView) holder.itemView).clearAllAnimations();
    super.onViewDetachedFromWindow(holder);

}

透明化

    public void clearAllAnimations() {
    for (RelativeLayout layout : layoutArray) {
        optionLayout.clearAnimation();
        html" target="_blank">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没有重置,并且在一些随机视图项目中以scaledup状态出现。

更新

我做了一个小实验:在ViewHolder项目中的ImageView上设置alpha动画,如下所示

Animation fadeInAnimation = AnimationUtils.loadAnimation(mContext, R.anim.fadein);
imageView.startAnimation(fadeInAnimation);

并使用了清晰的动画。imageView.clearAnimation();它工作和ImageView是可见正常时,下一次ViewItem出现在屏幕上。

但如果我这么做就不管用了

alphaAnimator = ObjectAnimator.ofFloat(centerImageView, "alpha", 1.0f, 0.5f);
        alphaAnimator.start();

为了清除这个

        alphaAnimator.removeAllListeners();
        alphaAnimator.cancel();
        alphaAnimator.end();

这不起作用。Alpha动画保留在ViewHolder图像项中。

共有3个答案

袁霍英
2023-03-14

我通过在onViewDetachedFromWindow中对所有动画师进行反向动画来解决这个问题。

@Override
public void onViewDetachedFromWindow(ViewHolder holder) {
    if (holder.getItemViewType() == 1) ((MyItemView) holder.itemView).reverseAllAnimations();
}
栾和风
2023-03-14

通过从crymson的答案中得到启发,我使用视图的标记方法,而不是在自定义适配器的复杂逻辑中设置一个布尔值,做出了一个简单而有用的解决方案。

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

冯卓
2023-03-14

我用这种方法解决了这个问题。一切正常。

GroupsViewHolder -它是自定义的RecyclerView。取景器

@Override
    public void onViewAttachedToWindow(GroupsViewHolder holder) {
        super.onViewAttachedToWindow(holder);
        //here add animation
    }

    @Override
    public void onViewDetachedFromWindow(GroupsViewHolder holder) {
        //here clear animation
        super.onViewDetachedFromWindow(holder);
    }
 类似资料:
  • 在其他回收器视图中有一个回收器视图。两者都需要垂直滚动。外部回收器视图滚动正常,但内部回收器视图滚动不正常。 这是代码: ViewAdapter如下: 我尝试了以下两种回收商观点,但都无法解决问题 也尝试了这个:

  • 新手在这里。当长时间按下卡片(列表项)时,我很难在单个列表项上实现动画。当我长按一张卡片时,所有卡片都会动画化。有人可以解释为什么只有当回收器View的水平滚动被我禁用时才会发生此问题。 主要活动: 回收器视图适配器:

  • 我有一个如下定义的表视图 当用户单击时,我使用单击的项目详细信息重新加载表。在我重新加载之前,我对表项调用清除 现在,当我单击另一个项目并尝试重新加载表格时,它看起来像下面这样。这是非常奇怪的,因为应该只有一行,但行的大小是一样的,就像从以前的点击,其余的行是空的,除了图标。当我点击图标时,没有任何反应。任何人以前都面临过这种情况。有人知道这是什么原因吗? 我的工具定义如下。它们只是2 的

  • 我已经在我的listView中实现了ViewHolder和ConvertView。我的listView由一个自定义适配器填充,其中包含一个预订列表。当我单击一个项目时,一个不可见的布局从右向左滑动,以显示按钮。我可以通过单击一个关闭按钮来关闭这个覆盖布局,以便它再次被隐藏。在这个覆盖布局上,我有一个删除按钮,它使我能够删除该项目。到目前为止一切都很好。当我擦除一个项目时,该项目会按预期消失,然后重

  • 当我在回收器视图中选择一个项目时,会自动选择多个项目 我正在做的是 我只想获取没有重复的联系人,并在recyclerview中列出所有联系人,并使两个文本视图可见(一个用于数字,第二个用于名称)。完成了,但问题是 当我点击一个项目时,它会被点击4次(例如,如果我点击一个项目,它会显示两个文本视图,但具有相同名称和编号的相同项目会显示出来,就像我点击了4个项目并看到图片一样) 适配器类 在那里我得到

  • 我正面临一个奇怪的错误,其中recyclerview只显示了一个项目。下面是我的recyclerview适配器的代码: 我已经在其他应用程序中使用了这段代码,它的工作非常完美。我已经检查了聊天数据,这也是完美的。 这里是指向git repo布局文件的链接:布局文件