smoothScrollToPosition не работает в recyclerView - PullRequest
0 голосов
/ 12 июня 2019

Я создал собственный класс 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 - анимация макета сработала. Есть ли способ использовать обе функции одновременно? что не так в моем коде?

1 Ответ

0 голосов
/ 21 июня 2019

Вы можете использовать scrollToPosition(itemNo) для достижения своей цели.

Как показано ниже:

recyclerview.scrollToPosition(20);

Используя smoothScrollToPosition, элементы прокручиваются очень быстро, поэтому анимация не работает.

...