Reputation: 619
The RecyclerView.scrollToPosition()
is extremely strange.
for example, supposed a RecyclerView
named "rv"
.
if now item 10 is under the current RecyclerView
, call rv.scrollToPosition(10)
, the RecyclerView
will scroll item 10 to bottom.
if now item 10 is in the current RecyclerView
, call rv.scrollToPosition(10)
, there won't be any scrolling, nothing will be done.
if now item 10 is on the top of the current RecyclerView
, call rv.scrollToPosition(10)
, the RecyclerView
will scroll item 10 to top.
To help understanding, look at this picture
But what i need is that, whenever i call it, the RecyclerView
will scroll the supposed position to the top of current view just like case 3. How to do that?
Upvotes: 57
Views: 136436
Reputation: 1201
this API is for you.
int offset = 0; recyclerView.scrollToPositionWithOffset(position, offset);
Upvotes: 0
Reputation: 1001
This is the Kotlin code snippet but you can just get the point for scrolling to the item by position properly. The point is to declare the member variable for the layout manager and use its method to scroll.
lateinit var layoutManager: LinearLayoutManager
fun setupView() {
...
layoutManager = LinearLayoutManager(applicationContext)
mainRecyclerView.layoutManager = layoutManager
...
}
fun moveToPosition(position: Int) {
layoutManager.scrollToPositionWithOffset(position, 0)
}
Upvotes: 6
Reputation: 1036
Below link might solve your problem:
https://stackoverflow.com/a/43505830/4849554
Just create a SmoothScroller with the preference SNAP_TO_START:
RecyclerView.SmoothScroller smoothScroller = new
LinearSmoothScroller(context) {
@Override protected int getVerticalSnapPreference() {
return LinearSmoothScroller.SNAP_TO_START;
}
};
Now you set the position where you want to scroll to:
smoothScroller.setTargetPosition(position);
And pass that SmoothScroller to the LayoutManager:
layoutManager.startSmoothScroll(smoothScroller);
Upvotes: 28
Reputation: 195
try recycler_view.smoothScrollBy(0, 100);
here 0 represents x-coordinate
and 100 represents y-coordinate
I used this in vertical recyclerView where I wanted to scroll to next position in the vertical list and for coming to the previous position I simply replaced 100 with -100
Upvotes: 0
Reputation: 12421
If you want to scroll to a specific position and that position is the adapter's position, then you can use StaggeredGridLayoutManager
scrollToPosition
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
staggeredGridLayoutManager.scrollToPosition(10);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
Upvotes: 5
Reputation: 6690
If I understand the question, you want to scroll to a specific position but that position is the adapter's position and not the RecyclerView
's item position.
You can only achieve this through the LayoutManager
.
Do something like:
rv.getLayoutManager().scrollToPosition(youPositionInTheAdapter).
Upvotes: 66