package it.slyce.messaging.utils; import android.support.v7.widget.RecyclerView; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScrollUtils { private static final int SMOOTH_SCROLL_IF_THIS_MUCH = 100000; public static void scrollToTopAfterDelay(RecyclerView mRecyclerView, RecyclerView.Adapter mRecyclerAdapter) { scrollToPositionAfterDelay(0, mRecyclerView, mRecyclerAdapter); } public static void scrollToBottomAfterDelay(RecyclerView mRecyclerView, RecyclerView.Adapter mRecyclerAdapter) { scrollToPositionAfterDelay(mRecyclerAdapter.getItemCount() - 1, mRecyclerView, mRecyclerAdapter); } public static void scrollToPositionAfterDelay(final int position, final RecyclerView mRecyclerView, final RecyclerView.Adapter mRecyclerAdapter) { ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(1); scheduleTaskExecutor.schedule(new Runnable() { @Override public void run() { scrollToPosition(position+1, mRecyclerView, mRecyclerAdapter); } }, 150, TimeUnit.MILLISECONDS); } public static void scrollToPosition(int position, RecyclerView mRecyclerView, RecyclerView.Adapter mRecyclerAdapter) { int offsetOfScroll = getOffsetOfGoal(position, mRecyclerView, mRecyclerAdapter); if (offsetOfScroll < SMOOTH_SCROLL_IF_THIS_MUCH) { mRecyclerView.smoothScrollToPosition(position); } else { mRecyclerView.scrollToPosition(position); } } private static int getOffsetOfGoal(int position, RecyclerView mRecyclerView, RecyclerView.Adapter mRecyclerAdapter) { int scrollPosition = mRecyclerView.computeVerticalScrollOffset(); int goalPosition; if (position == 0) { // we are at the top goalPosition = 0; } else if (position == mRecyclerAdapter.getItemCount() - 1) { goalPosition = mRecyclerView.computeVerticalScrollRange(); } else { goalPosition = 100000000; // this will cause scrollToPosition() to be called, which we want } return Math.abs(scrollPosition - goalPosition); } }