2015-05-15 2 views
3

В моем приложении для чата я использую RecyclerView и LayoutManager для отображения списка сообщений чата. У меня есть случай, когда пользователь просматривает старые сообщения и приходит новое сообщение. В этот момент я хочу прокрутить чат на небольшом расстоянии, чтобы подтвердить пользователя полученного нового сообщения. Мне нужно прокрутить мой RecyclerView на расстояние в пикселях. я обнаружил, что LayoutManager есть метод scrollVerticallyBy,Вертикальная прокрутка RecyclerView в Android на пикселях

public int scrollVerticallyBy (int dy, RecyclerView.Recycler recycler, RecyclerView.State state) 

Но я запуталась параметрами он требует, RecyclerView.Recycler утилизатор, RecyclerView.State состояние, , и я не уверен, если это будет делать мой работа.

Другими словами, я хочу найти replcament для ListView.smoothScrollBy (int distance, int duration);

ответ

2

Вы можете использовать:

recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount()); 

если муравей соответствующей позиции.

recyclerView.smoothScrollToPosition(0); 

исй: 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); 
} 

Экземпляр LinearSmoothScroller, который отвечает за выполнение фактической прокрутки. Это не тривиальный класс - он содержит очень много логики. Однако поведение, которое он реализует, довольно просто понять. Вместо того, чтобы пытаться определить точное количество пикселей, которые ему нужно прокрутить, до достижения конечной точки, он выполняет серию 10000 пикселей стреляет со скоростью 25 миллисекунд на дюйм до тех пор, пока конечный целевой объект не появится в окне просмотра, а затем он замедляет остановку с видимой конечной мишенью.

+2

Я хочу, чтобы прокручивать расстояния, не до конца или начала списка. –

+0

Я изменяю свой ответ, это лучшая форма пикселя, которую вы используете. – NovusMobile

+0

Так, например, у меня есть 100 сообщений в списке, и я где-то посередине списка. Я хочу прокрутить одно сообщение вниз, как я могу использовать ваш код? –

3

Лучший способ для достижения этой цели является использование этого:

recyclerView.smoothScrollBy(0, 100);

Это подпись метода. Вы можете прокручивать в х и у оси:

public void smoothScrollBy(int dx, int dy)

Примечание: Если smothScrollBy(dx,dy) не работает в связи с RecyclerView не загружен с ее элементами. Для этого я бы порекомендовал с помощью:

new Handler().postDelayed(new Runnable() { 
    @Override public void run() { 
    recyclerView.smoothScrollBy(0, 100); 
    } 
}, 200); 

Таким образом, вы можете быть уверены, что мнения были загружены

+0

Что делать, если я не хочу, чтобы плавная прокрутка, я просто хочу прокрутить ее до этой точки оси напрямую, что я использую в этом случае? RecyclerView.scrollBy(), похоже, не работает. – Sagar

+0

@Sagar, вы проверили, были ли элементы уже загружены при вызове метода? Следуйте моему предложению в конце ответа – Antonio

+0

Спасибо, это помогло! – Sagar