Подтвердить что ты не робот

Как оживить recyclerview на свитке, как Google Plus/Google?

Как я могу анимировать RecyclerView, когда элементы отображаются в первый раз, а также когда пользователь прокручивается, точно так же, как он работает для приложения google plus или приложения для новостей Google.

Также я где-то читал, что RecyclerView не поддерживает анимацию, когда пользователь прокручивает; если это правда, есть ли способ, которым мы все еще можем это сделать?

4b9b3361

Ответ 1

Я сделал это таким образом. Может помочь кому-нибудь. Я не знаю, является ли это лучшим способом сделать это, но отлично работает для меня.

ОБНОВЛЕНИЕ: Чтобы исправить быстрое поведение прокрутки, переопределить onViewDetachedFromWindow метод адаптера и вызвать clearAnimation на анимированном зрении (в данном случае, holder.itemView.clearAnimation()).like следующим образом:

 @Override
public void onViewDetachedFromWindow(@NonNull ViewHolder holder) {
    super.onViewDetachedFromWindow(holder);
    holder.itemView.clearAnimation();
}

up_from_bottom.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:shareInterpolator="@android:anim/decelerate_interpolator">
<translate
    android:fromXDelta="0%" android:toXDelta="0%"
    android:fromYDelta="100%" android:toYDelta="0%"
    android:duration="400" />
</set>

down_from_top.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:shareInterpolator="@android:anim/decelerate_interpolator">
<translate
    android:fromXDelta="0%" android:toXDelta="0%"
    android:fromYDelta="-100%" android:toYDelta="0%"
    android:duration="400" />
</set>

И, наконец, поместите этот код в onBindViewHolder из recyclerView. Создайте поле с именем lastPosition и инициализируйте его как -1.

Animation animation = AnimationUtils.loadAnimation(context,
            (position > lastPosition) ? R.anim.up_from_bottom
                    : R.anim.down_from_top);
    holder.itemView.startAnimation(animation);
    lastPosition = position;

Ответ 3

Для down_from_top.xml он должен быть

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
 android:shareInterpolator="@android:anim/decelerate_interpolator">
<translate
    android:fromXDelta="0%" android:toXDelta="0%"
    android:fromYDelta="-100%" android:toYDelta="0%"
    android:duration="400" />
</set>

Ответ 4

https://github.com/wasabeef/recyclerview-animators

В моем коде есть что-то вроде этого:

import jp.wasabeef.recyclerview.animators.adapters.AlphaInAnimationAdapter;

....

public function populate() {
   // Get your recicleview
   rv = (RecyclerView)findViewById(R.id.rv);
   rv.setHasFixedSize(true);

   // Populate your cursor with your own method...
   Cursor myRecycleItems= null;
   myRecycleItems= mDbHelper.getItems();

   //create your 
   itemsAdapter= new ItemsAdapter(myRecycleItems, getApplicationContext());


   //Finnaly apply your adapter to RV with AlphaInAnimationAdapter:
   rv.setAdapter(new AlphaInAnimationAdapter(itemsAdapter));

}

Вам нужно добавить зависимости к вашему gradle

dependencies {
  // jCenter
  ...... 
  your curent dependencies 
  ....
  compile 'jp.wasabeef:recyclerview-animators:2.0.0'
}

Прочтите форму doc https://github.com/wasabeef/recyclerview-animators, чтобы установить ее.

Ответ 5

Без каких-либо внешних библиотек в RecycleView.Adapter по методу onBindViewHolder используйте анимацию, как в примере:

       if (position>lastAnimatedPosition) {


        //set init transitionY to animate from it
        holder.itemView.setTranslationY(holder.itemView.getHeight());

        //animate to orginal position
        holder.itemView.animate().translationYBy(-  holder.itemView.getHeight()).start();


        lastAnimatedPosition=position;
    }

Над кодом будет анимировать снизу каждую строку в списке. Анимация будет выполняться только один раз, но onBindViewHolder работает при прокрутке, поэтому первая прокрутка списка будет с эффектом анимации.

Очень важно инициализировать представление для начала анимации, поэтому в примере i:

  holder.itemView.setTranslationY( + Y change);

тогда анимация возвращается в исходное положение:

 holder.itemView.animate().translationYBy(- Y change).start();

Если вам нужна альфа, сделайте так:

 holder.itemView.setAlpha(0);
 holder.itemView.animate().apha(1).start();