Я создал собственный класс LinearLayoutManager. Моя цель - сгладить ScrollToPosition с анимацией. Вот мой код:
public class LinearLayoutManagerWithSmoothScroller extends LinearLayoutManager {
private static final float MILLISECONDS_PER_INCH = 100f;
public LinearLayoutManagerWithSmoothScroller(Context context) {
super(context, VERTICAL, false);
}
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
int position) {
RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext());
smoothScroller.setTargetPosition(position);
startSmoothScroll(smoothScroller);
}
private class TopSnappedSmoothScroller extends LinearSmoothScroller {
public TopSnappedSmoothScroller(Context context) {
super(context);
}
@Override
public PointF computeScrollVectorForPosition(int targetPosition) {
return LinearLayoutManagerWithSmoothScroller.this
.computeScrollVectorForPosition(targetPosition);
}
@Override
protected float calculateSpeedPerPixel
(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH/displayMetrics.densityDpi;
}
@Override
protected int getVerticalSnapPreference() {
return SNAP_TO_START;
}
}
}
Кроме того, я создал пользовательскую анимацию LayoutAnimation в RecyclerView. Вот код XML
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_from_bottom"
android:delay="15%"
android:animationOrder="normal"
/>
А вот мой код Java.
leaderBoardAdapter = new SPGamificationLeaderBoardAdapter(response.list, getContext());
leaderBoardRecyclerView.setAdapter(leaderBoardAdapter);
leaderBoardRecyclerView.setHasFixedSize(true);
leaderBoardRecyclerView.setNestedScrollingEnabled(false);
LayoutAnimationController controller =
AnimationUtils.loadLayoutAnimation(getContext(), R.anim.layout_animation_from_bottom);
leaderBoardRecyclerView.setLayoutManager(smoothScroller);
leaderBoardRecyclerView.setLayoutAnimation(controller);
leaderBoardRecyclerView.scheduleLayoutAnimation();
leaderBoardRecyclerView.post(() -> leaderBoardRecyclerView.smoothScrollToPosition(getPosition(response)));
Моя проблема заключается в том, что оба параметра (smoothScrollToPosition и LayoutAnimation) не работают одновременно. Я удалил smoothScrollToPosition и анимацию макета сработала, а гладкий скил ScrollScrollToPosition - анимация макета сработала.
Есть ли способ использовать обе функции одновременно? что не так в моем коде?