Scroll RecyclerView to show selected item on top
I'm looking for a way to scroll a RecyclerView
to show the selected item on top.
In a ListView
I was able to do that by using scrollTo(x,y)
and getting the top of the element that need to be centered.
Something like:
@Override
public void onItemClick(View v, int pos){
mylistView.scrollTo(0, v.getTop());
}
The problem is that the RecyclerView
returns an error when using it's scrollTo
method saying
RecyclerView does not support scrolling to an absolute position
How can I scroll a RecyclerView
to put the selected item at the top of the view?
Solution 1:
If you are using the LinearLayoutManager
or Staggered GridLayoutManager
, they each have a scrollToPositionWithOffset method that takes both the position and also the offset of the start of the item from the start of the RecyclerView
, which seems like it would accomplish what you need (setting the offset to 0 should align with the top).
For instance:
//Scroll item 2 to 20 pixels from the top
linearLayoutManager.scrollToPositionWithOffset(2, 20);
Solution 2:
If you looking for vertical LinearLayout Manager you can achieve smooth scrolling using a custom LinearSmoothScroller
:
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;
public class SnappingLinearLayoutManager extends LinearLayoutManager {
public SnappingLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
@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 SnappingLinearLayoutManager.this
.computeScrollVectorForPosition(targetPosition);
}
@Override
protected int getVerticalSnapPreference() {
return SNAP_TO_START;
}
}
}
use an instance of the layoutmanager in recycle view and then calling recyclerView.smoothScrollToPosition(pos);
will smooth scroll to selected position to top of the recycler view
Solution 3:
//Scroll item pos
linearLayoutManager.scrollToPositionWithOffset(pos, 0);
Solution 4:
You just need to call recyclerview.scrollToPosition(position)
. That's fine!
If you want to call it in adapter, just let your adapter has the instance of recyclerview or the activity or fragment which contains recyclerview,than implements the method getRecyclerview()
in them.
I hope it can help you.