Как использовать RecyclerView.scrollToPosition(), чтобы переместить позицию в начало текущего представления?

RecyclerView.scrollToPosition() очень странный. например, предположительно RecyclerView именем "rv".

  1. если теперь элемент 10 находится под текущим RecyclerView, вызовите rv.scrollToPosition(10), RecyclerView прокрутит элемент 10 до дна.

  2. если теперь элемент 10 находится в текущем RecyclerView, вызовите rv.scrollToPosition(10), прокрутки не будет, ничего не будет сделано.

  3. если теперь элемент 10 находится в верхней части текущего RecyclerView, вызовите rv.scrollToPosition(10), RecyclerView прокрутит элемент 10 в начало.

Чтобы помочь пониманию, посмотрите на эту картинку enter image description here

Но что мне нужно, так это то, что всякий раз, когда я вызываю его, RecyclerView прокручивает предполагаемую позицию в верхнюю часть текущего представления, как в случае 3. Как это сделать?

Ответ 1

Если я понимаю вопрос, вы хотите прокрутить до определенной позиции, но это положение - позиция адаптера, а не позиция позиции RecyclerView.

Вы можете достичь этого только с помощью LayoutManager.

Сделайте что-то вроде:

rv.getLayoutManager().scrollToPosition(youPositionInTheAdapter).

Ответ 2

Ниже ссылка может решить вашу проблему:

fooobar.com/questions/161294/...

Просто создайте SmoothScroller с предпочтением SNAP_TO_START:

RecyclerView.SmoothScroller smoothScroller = new 
LinearSmoothScroller(context) {
   @Override protected int getVerticalSnapPreference() {
       return LinearSmoothScroller.SNAP_TO_START;
   }
};

Теперь вы устанавливаете позицию, в которой вы хотите прокрутить:

smoothScroller.setTargetPosition(position);

И передайте этот SmoothScroller в LayoutManager:

layoutManager.startSmoothScroll(smoothScroller);

Ответ 3

Если вы хотите прокрутить до определенной позиции, и эта позиция является позицией адаптера, то вы можете использовать StaggeredGridLayoutManager scrollToPosition

   StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
   staggeredGridLayoutManager.scrollToPosition(10);
   recyclerView.setLayoutManager(staggeredGridLayoutManager);

Ответ 4

попробуйте recycler_view.smoothScrollBy(0, 100); здесь 0 представляет x-coordinate а 100 представляет y-coordinate Я использовал это в вертикальной программе recyclerView, где я хотел прокрутить до следующей позиции в вертикальном списке, а для перехода к предыдущей позиции я просто заменил 100 на -100