安卓回收器查看如何仅对项目进行一次动画处理



我有一个RecyclerViewAdapter,我需要这些项目在它们第一次出现在屏幕上时(即向下滚动时(进行动画处理,但只有一次,第一次出现,之后每当用户向上滚动时,就不应该有任何动画。

除了最后一项之外,我的代码现在可以完美运行,当我向下滚动到它时,它总是一遍又一遍地动画。

private Integer lastPosition = -1;
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    holder.setIsRecyclable(false);
    // Animations
    // If the bound view wasn't previously displayed on screen, it's animated
    if (position > lastPosition) {
        holder.mImage.setAnimation(AnimationUtils.loadAnimation(context, R.anim.first_animation));
        holder.mView.setAnimation(AnimationUtils.loadAnimation(context, R.anim.second_animation));
        lastPosition = position -1;
    }
}

如果我设置lastPosition = position;我只会加载前几个项目(并且根据屏幕尺寸可见(进行动画处理,当我向下滚动时,它们不会进行任何动画处理。

为什么会有这种行为?正如此处首次使用它们通过滚动对项目进行动画处理的所有示例一样

lastPosition = position;

但是我的失败了?

我的回收器适配器是可过滤的(implements Filterable(,如果这对问题有任何本质。

您可以向列表项添加其他属性,并检查何时进行动画处理,何时不进行动画处理:

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    //Checking if has already animated
    if (!list.get(position).hasAnimated()) {
        //Mark this ViewHolder as animated
        list.get(position).setHasAnimated();
        holder.mImage.setAnimation(AnimationUtils.loadAnimation(context, R.anim.first_animation));
        holder.mView.setAnimation(AnimationUtils.loadAnimation(context, R.anim.second_animation));
    }
}

这是可以在 RecyclerViewAdapter 类中使用的解决方法

ArrayList<Boolean> hasAnimation;
public RecyclerViewAdapter(Context context) {
    hasAnimation=new ArrayList<>();
    this.context=context;
}

然后在 onBindViewHolder 方法中

 @Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
    hasAnimation.add(true);
    if (hasAnimation.get(position)){
        Animation animation1= AnimationUtils.loadAnimation(context, R.anim.first_animation);
        Animation animation2= AnimationUtils.loadAnimation(context, R.anim.second_animation);
        animation1.setDuration(1000);
        animation2.setDuration(1000);
        holder.mImage.startAnimation(animation1);
        holder.mView.startAnimation(animation2);
        hasAnimation.set(position,false);
    }}

当然,您可以使用动画部分中的代码简化该过程

    holder.mImage.setAnimation(AnimationUtils.loadAnimation(context, R.anim.first_animation));
    holder.mView.setAnimation(AnimationUtils.loadAnimation(context, R.anim.second_animation));

希望有帮助

最新更新