package org.wordpress.android.ui.prefs; import android.content.Context; import android.graphics.PointF; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearSmoothScroller; import android.support.v7.widget.RecyclerView; import android.view.View; /** * LinearLayoutManager with smooth scrolling and custom duration (in milliseconds). */ public class SmoothScrollLinearLayoutManager extends LinearLayoutManager { private final int mDuration; public SmoothScrollLinearLayoutManager(Context context, int orientation, boolean reverseLayout, int duration) { super(context, orientation, reverseLayout); this.mDuration = duration; } @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { final View firstVisibleChild = recyclerView.getChildAt(0); final int itemHeight = firstVisibleChild.getHeight(); final int currentPosition = recyclerView.getChildPosition(firstVisibleChild); int distanceInPixels = Math.abs((currentPosition - position) * itemHeight); if (distanceInPixels == 0) { distanceInPixels = (int) Math.abs(firstVisibleChild.getY()); } final SmoothScroller smoothScroller = new SmoothScroller(recyclerView.getContext(), distanceInPixels, mDuration); smoothScroller.setTargetPosition(position); startSmoothScroll(smoothScroller); } private class SmoothScroller extends LinearSmoothScroller { private final float mDistanceInPixels; private final float mDuration; public SmoothScroller(Context context, int distanceInPixels, int duration) { super(context); this.mDistanceInPixels = distanceInPixels; this.mDuration = duration; } @Override protected int calculateTimeForScrolling(int distance) { final float proportion = (float) distance / mDistanceInPixels; return (int) (mDuration * proportion); } @Override public PointF computeScrollVectorForPosition(int targetPosition) { return SmoothScrollLinearLayoutManager.this.computeScrollVectorForPosition(targetPosition); } } }