Recyclerview слетает анимация с элемента при скроллинге списка

336
02 мая 2017, 05:10

Необходимо задать анимацию нажатому элементу списка. Я делаю это так:

 @Override
 public void onClick(View view, int index) {
       view.startAnimation(animation);
    }

но когда прокручиваю список элементов Recyclerview анимация останавливается. P.S анимация у меня зациклена, т.е нажимаю на элемент и она выполняется пока я не нажму на другой элемент и т.д

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    switch (holder.getItemViewType()) {
        case 0:
            posInList = position / 2;
           Picasso.with(mContext).load(imageModel.get(posInList)).resize(320, 320)
                    .into(holder.getItemImageView());
            break;
        case 2:
            break;
    }
}

Анимация:

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="true">
<scale
    android:duration="500"
    android:fillBefore="true"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:startOffset="0"
    android:toXScale="0.9"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:repeatCount="infinite"
    android:repeatMode="reverse"
    android:toYScale="0.9" />

Answer 1

Спасибо ЮрийСПб за совет. Сделал так:

private SparseBooleanArray mSparseBooleanArray;
 construktor(){
mSparseBooleanArray = new SparseBooleanArray();
 }
 onBindViewHolder(){
    if (mSparseBooleanArray.get(posInList)){
                holder.getItemImageView().startAnimation(anim);
            }
  }

 public void itemClicked(int item){
    mSparseBooleanArray.clear();
    mSparseBooleanArray.put(item,true);
}

в итоге: анимация не слетает при скроллинге

Answer 2

При скроле списка и ухода ячейки за край экрана она открепляется системой от разметки. При этом вызывается метод onViewDetachedFromWindow(ViewHolderClass holder) - в нём вы можете останавливать анимации, выгружать картинки и делать прочие вещи для избежания утечек памяти. В качестве аргумента приходит определённый вами в адаптере холдер указанного вами типа. Если их у вас несколько - то вам надо соамостоятельно скастовать пришедший к нужному. Из холдера же вы можете получить position метода getAdapterPosition().

Точно также работает и нужный вам void onViewAttachedToWindow(ViewHolderClass holder) - он вызывается когда ранее откреплённая от разметки вьюха ячейки списка снова прикрепляется к оному при появлении на экране в процессе скрола. Именно в этом методе вам надо скастовать пришедший в аргументе холдер к вашему типу и, в случае если нужно, запустить анимацию снова, т.к. она останавливается при откреплении вью от разметки. Определять какую ячейку надо анимировать а какую нет вам придётся самостоятельно - храните в адаптере, например, индексы анимируемых элементов.

READ ALSO
java: как писать в InputStream/читать из outputstream?

java: как писать в InputStream/читать из outputstream?

чтобы считать из inputstream надо сначала туда что-то положить, верно?

341
Map size can&#39;t be 0

Map size can't be 0

В своем приложении использую google maps, но при переходе между активностями, бывает вылетает приложение со следующей ошибкой

328
Загрузить картинку не получается

Загрузить картинку не получается

Ребята, мне нужно сделать следующее: Если у пользователя нету своей аватарки,то нужно поставить ему дефолтную картинкуНо у меня это не получается

249
Google переводчик - как на java составить запрос на перевод слова?

Google переводчик - как на java составить запрос на перевод слова?

Есть английское словоДля него нужно получить перевод через Google переводчик

940