Reputation: 6369
In my chat app I use RecyclerView
and LayoutManager
for showing chat messages list. I have a case when user browse old messages and new message arrives. At that point I want to scroll chat by small distance to acknowledge user of received new message.
I need to scroll my RecyclerView
by distance in pixels.
I found that LayoutManager
has method scrollVerticallyBy()
,
public int scrollVerticallyBy (int dy, RecyclerView.Recycler recycler, RecyclerView.State state)
But I got confused by parameters it requires, RecyclerView.Recycler recycler
, RecyclerView.State state
and I am not sure if it will do my job.
In other words, I want to find replacement for ListView.smoothScrollBy(int distance, int duration)
Upvotes: 10
Views: 8597
Reputation: 11
You can scroll to the bottom of the recycler view directly like this without using smoothScroll.
/* Method to set the recycler view focus to bottom */
private void scrollToBottom() {
mRecyclerView.scrollToPosition(mAdapter.getItemCount() - 1);
}
Upvotes: 0
Reputation: 11523
The best way to achieve this is using this:
recyclerView.smoothScrollBy(0, 100);
This is the signature of the method. You can scroll in x and y axis:
public void smoothScrollBy(int dx, int dy)
Note: If smothScrollBy(dx,dy)
does not work is due to the RecyclerView has not been already loaded with its elements. For that I would recomend using:
new Handler().postDelayed(new Runnable() {
@Override public void run() {
recyclerView.smoothScrollBy(0, 100);
}
}, 200);
In that way, you can be sure that the views have been loaded
Upvotes: 11
Reputation: 1823
You can use:
recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount());
if ant relevant position .
recyclerView.smoothScrollToPosition(0);
ref : http://blog.stylingandroid.com/scrolling-recyclerview-part-1/
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
int position) {
LinearSmoothScroller linearSmoothScroller =
new LinearSmoothScroller(recyclerView.getContext()) {
@Override
public PointF computeScrollVectorForPosition(int targetPosition) {
return LinearLayoutManager.this
.computeScrollVectorForPosition(targetPosition);
}
};
linearSmoothScroller.setTargetPosition(position);
startSmoothScroll(linearSmoothScroller);
}
The instance of LinearSmoothScroller which is responsible for performing the actual scroll. This isn’t a trivial class – it contains an awful lot of logic. However the behaviour that it implements is fairly simple to understand. Rather than try and determine the exact number of pixels that it needs to scroll through before reaching the end point, it performs a series of 10000 pixel flings at a speed of 25 milliseconds per inch until the end target item comes in to the viewport, and then it decelerates to stop with the end target visible.
Upvotes: 1