Как оживить recyclerview на свитке, как Google Plus/Google?
Как я могу анимировать RecyclerView
, когда элементы отображаются в первый раз, а также когда пользователь прокручивается, точно так же, как он работает для приложения google plus или приложения для новостей Google.
Также я где-то читал, что RecyclerView
не поддерживает анимацию, когда пользователь прокручивает; если это правда, есть ли способ, которым мы все еще можем это сделать?
Ответы
Ответ 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;
Ответ 2
Используйте Custom ItemAnimator с анимацией "slide up" для добавления действия.
Например: https://github.com/wasabeef/recyclerview-animators
Ответ 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();