private void smoothSnapToPosition(int scrollY,int availableScrollHeight,AlphabeticalAppsList.FastScrollSectionInfo info){
  mRv.removeCallbacks(mSmoothSnapNextFrameRunnable);
  mRv.removeCallbacks(mFastScrollToTargetSectionRunnable);
  trackAllChildViews();
  if (mHasFastScrollTouchSettled) {
    mCurrentFastScrollSection=info.sectionName;
    mTargetFastScrollSection=null;
    updateTrackedViewsFastScrollFocusState();
  }
 else {
    mCurrentFastScrollSection=null;
    mTargetFastScrollSection=info.sectionName;
    mHasFastScrollTouchSettled=false;
    updateTrackedViewsFastScrollFocusState();
    mRv.postDelayed(mFastScrollToTargetSectionRunnable,mHasFastScrollTouchSettledAtLeastOnce ? REPEAT_TOUCH_SETTLING_DURATION : INITIAL_TOUCH_SETTLING_DURATION);
  }
  int newScrollY=Math.min(availableScrollHeight,mRv.getPaddingTop() + mRv.getTop(info.fastScrollToItem.rowIndex));
  int numFrames=mFastScrollFrames.length;
  for (int i=0; i < numFrames; i++) {
    mFastScrollFrames[i]=(newScrollY - scrollY) / numFrames;
  }
  mFastScrollFrameIndex=0;
  mRv.postOnAnimation(mSmoothSnapNextFrameRunnable);
}

private void smoothSnapToPosition ( int scrollY , int availableScrollHeight , AlphabeticalAppsList . FastScrollSectionInfo info ) { mRv . removeCallbacks ( mSmoothSnapNextFrameRunnable ) ; mRv . removeCallbacks ( mFastScrollToTargetSectionRunnable ) ; trackAllChildViews ( ) ; if ( mHasFastScrollTouchSettled ) { mCurrentFastScrollSection = info . sectionName ; mTargetFastScrollSection = null ; updateTrackedViewsFastScrollFocusState ( ) ; } else { mCurrentFastScrollSection = null ; mTargetFastScrollSection = info . sectionName ; mHasFastScrollTouchSettled = false ; updateTrackedViewsFastScrollFocusState ( ) ; mRv . postDelayed ( mFastScrollToTargetSectionRunnable , mHasFastScrollTouchSettledAtLeastOnce ? REPEAT_TOUCH_SETTLING_DURATION : INITIAL_TOUCH_SETTLING_DURATION ) ; } int newScrollY = Math . min ( availableScrollHeight , mRv . getPaddingTop ( ) + mRv . getTop ( info . fastScrollToItem . rowIndex ) ) ; int numFrames = mFastScrollFrames . length ; for ( int i = 0 ; i < numFrames ; i ++ ) { mFastScrollFrames [ i ] = ( newScrollY - scrollY ) / numFrames ; } mFastScrollFrameIndex = 0 ; mRv . postOnAnimation ( mSmoothSnapNextFrameRunnable ) ; }
smoothly snaps to a given position . we do this manually by calculating the keyframes ourselves and animating the scroll on the recycler view .
