Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RecyclerView smoothScroll to position in the center. android

I am using a horizontal layout manager for my RecyclerView. I need to make RecyclerView in the next way: when click on some item - make smoothScrool to that position and put that item in the center of RecyclerView (if it possible, for example, 10 item from 20).

So, I have no problem with smoothScrollToPosition(), but how to put item than in the center of RecyclerView???

Thanks!

like image 927
Stan Malcolm Avatar asked Jul 16 '16 22:07

Stan Malcolm


1 Answers

Yes it's possible.

By implementing RecyclerView.SmoothScroller's method onTargetFound(View, State, Action).

/**  * Called when the target position is laid out. This is the last callback SmoothScroller  * will receive and it should update the provided {@link Action} to define the scroll  * details towards the target view.  * @param targetView    The view element which render the target position.  * @param state         Transient state of RecyclerView  * @param action        Action instance that you should update to define final scroll action  *                      towards the targetView  */ abstract protected void onTargetFound(View targetView, State state, Action action); 

Specifically in LinearLayoutManager with LinearSmoothScroller:

public class CenterLayoutManager extends LinearLayoutManager {      public CenterLayoutManager(Context context) {         super(context);     }      public CenterLayoutManager(Context context, int orientation, boolean reverseLayout) {         super(context, orientation, reverseLayout);     }      public CenterLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {         super(context, attrs, defStyleAttr, defStyleRes);     }      @Override     public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {         RecyclerView.SmoothScroller smoothScroller = new CenterSmoothScroller(recyclerView.getContext());         smoothScroller.setTargetPosition(position);         startSmoothScroll(smoothScroller);     }      private static class CenterSmoothScroller extends LinearSmoothScroller {          CenterSmoothScroller(Context context) {             super(context);         }          @Override         public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {             return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2);         }     } } 
like image 55
user3680200 Avatar answered Sep 23 '22 12:09

user3680200