RecylerView прокручивает до нужной позиции без анимации

Раньше, когда я хочу прокрутить ListView до желаемой позиции, я буду использовать

listView.setSelection(row);

ListView будет прокручиваться без какой-либо анимации - Android List View задает позицию по умолчанию без анимации

Теперь я хочу добиться такого же эффекта для RecyclerView. Я пытаюсь выполнить

((LinearLayoutManager)recyclerView.getLayoutManager()).scrollToPositionWithOffset(row, 0);

Тем не менее, есть прокрутка анимации, которую я бы хотел избежать.

Есть ли способ, которым я могу выполнять программную прокрутку без анимации?

Это анимация, которую я имел в виду - https://youtu.be/OKsUKwBLoks

Заметьте, я уже пробовал следующие способы. Все они создают анимацию.

  • scrollToPositionWithOffset
  • smoothScrollToPosition
  • scrollToPosition

Ответ 1

Добавьте эту строку в свой макет. Xml

android:overScrollMode="never"

РЕДАКТИРОВАТЬ:

Другой способ прокрутки recycleview

recyclerView.smoothScrollToPosition(position);

Ответ 2

Я знаю, что немного опоздал с этим ответом, но это может помочь кому-то другому. Попробуйте следовать (по крайней мере, я не мог видеть анимацию при ее использовании):

Котлин:

    //-- Immediately jump to the position in RecyclerView without delay or animation.
    mRecyclerView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            mRecyclerView.scrollToPosition(position)
            mRecyclerView.viewTreeObserver.removeOnGlobalLayoutListener(this)
        }
    })

Ява:

mRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            mRecyclerView.scrollToPosition(position);
            mRecyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
});

Ответ 3

Вы можете прокручивать без анимации с помощью:

recyclerView.scrollToPosition(position)

Ответ 4

Это можно легко переделать, когда вы вызываете notifyItemInserted() с помощью scrollToPosition() в одно и то же время.

Анимация вызвана DefaultItemAnimator в классе анимации DefaultItemAnimator по умолчанию RecyclerView.

Я нашел видео Youtube, которое перепрограммировало проблему другим человеком.

И у меня тоже есть решение:

  • Сначала прокрутите до последней позиции с помощью scrollToPosition().
  • Во-вторых, подождите немного, чтобы позволить менеджеру макета завершить прокрутку.
  • В-третьих, добавьте элемент в набор данных адаптера.
  • В-четвертых, notifyItemInserted() вызываем notifyItemInserted() и scrollToPosition().

У меня есть пример кода, но он написан в , но он делает то же самое с с лямбда-выражением. Если вам нужен доступ к RecyclerView внутри адаптера, вы можете посмотреть в Adapter.onAttachedToRecyclerView().

if (Adapter.ListData.Count > 2) Adapter.RecyclerView.ScrollToPosition(Adapter.ListData.Count - 1);
Adapter.RecyclerView.PostDelayed(() =>
{
    Adapter.ListData.Add(new ItemSimplyfiedAdapter.Standard
    {
       //Some new item inserting into data set.
    });
    Adapter.NotifyItemInserted(Adapter.ListData.Count - 1);
    Adapter.RecyclerView?.ScrollToPosition(Adapter.ListData.Count - 1);
}, 100);