Android Recycler Посмотрите, как анимировать предметы только один раз? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть 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;

Но мой отказывает?

Мой RecyclerAdapter фильтруется (implements Filterable), если это будет любойсуть вопроса.

1 Ответ

0 голосов
/ 25 апреля 2019

Вы можете добавить дополнительное свойство к элементу списка и проверить, когда анимировать, а когда нет:

@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));
    }
}
...