Rafael
Rafael

Reputation: 6369

Vertical scroll the RecyclerView in Android by pixels

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

Answers (3)

Nithin Nagaraju
Nithin Nagaraju

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

Antonio
Antonio

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

NovusMobile
NovusMobile

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

Related Questions