В RecyclerView я могу внезапно прокрутить к началу выбранного элемента, используя:
((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(position, 0);
Однако это резко перемещает элемент в верхнее положение. Я хочу плавно перейти к началу элемента .
Я также пробовал:
recyclerView.smoothScrollToPosition(position);
но он не работает, так как не перемещает элемент в позицию, выбранную наверху. Он просто прокручивает список, пока не станет виден элемент в позиции.
protected int getHorizontalSnapPreference() { return LinearSmoothScroller.SNAP_TO_START; }
. Кроме того, мне пришлось реализовать абстрактный методpublic PointF computeScrollVectorForPosition(int targetPosition) { return layoutManager.computeScrollVectorForPosition(targetPosition); }
.для этого вам нужно создать собственный LayoutManager
используйте это для своего RecyclerView и вызовите smoothScrollToPosition.
пример :
это приведет к прокрутке вверх элемента RecyclerView указанной позиции.
надеюсь это поможет.
источник
smoothScrollToPosition
. Почему может возникнуть эта проблема? Спасибо.Это функция расширения, которую я написал на Kotlin для использования с
RecyclerView
(на основе ответа @Paul Woitaschek):Используйте это так:
источник
Мы можем попробовать вот так
источник
Переопределите функцию calculateDyToMakeVisible / calculateDxToMakeVisible в LinearSmoothScroller, чтобы реализовать смещение позиции Y / X
источник
Самый простой способ прокрутки, который я нашел,
RecyclerView
заключается в следующем:источник
Я использовал вот так:
источник
Спасибо, @droidv за решение. Если кто-то ищет решение Kotlin, обратитесь к этому:
источник
CustomLinearLayout.kt:
Примечание. В приведенном выше примере задано ГОРИЗОНТАЛЬНОЕ направление, вы можете указать ВЕРТИКАЛЬНОЕ / ГОРИЗОНТАЛЬНОЕ во время инициализации.
Если вы установите направление на ВЕРТИКАЛЬНОЕ, вы должны изменить « calculateDxToMakeVisible » на « calculateDyToMakeVisible » (также обратите внимание на возвращаемое значение вызова супертипа)
Activity / Fragment.kt :
источник
Вероятно, подход @droidv является правильным, но я просто хочу опубликовать что-то немного другое, которое в основном выполняет ту же работу и не требует расширения LayoutManager.
ПРИМЕЧАНИЕ здесь - это будет работать хорошо, если ваш элемент (тот, который вы хотите прокрутить в верхней части списка) отображается на экране, и вы просто хотите автоматически прокрутить его вверх. Это полезно, когда последний элемент в вашем списке имеет какое-либо действие, которое добавляет новые элементы в тот же список, и вы хотите сосредоточить внимание пользователя на новых добавленных элементах:
Идея проста: 1. Нам нужно получить координату вершины элемента recyclerview; 2. Нам нужно получить верхнюю координату элемента просмотра, который мы хотим прокрутить вверх; 3. В конце с рассчитанным смещением нам нужно сделать
200 - это просто пример жестко закодированного целочисленного значения, которое вы можете использовать, если элемент держателя просмотра не существует, потому что это тоже возможно.
источник
Я хочу более полно рассмотреть вопрос о продолжительности прокрутки , которая, если вы выберете какой-либо более ранний ответ, на самом деле будет сильно (и неприемлемо) варьироваться в зависимости от количества прокрутки, необходимого для достижения целевой позиции из текущей позиции.
Чтобы получить единообразную продолжительность прокрутки, скорость (пикселей в миллисекунду) должна учитывать размер каждого отдельного элемента, а когда элементы нестандартного размера, добавляется совершенно новый уровень сложности.
Возможно, поэтому разработчики RecyclerView развернули слишком жесткую корзину для этого жизненно важного аспекта плавной прокрутки.
Предполагая, что вам нужна полуравномерная продолжительность прокрутки и что ваш список содержит полуоднородные элементы, вам понадобится что-то вроде этого.
PS: Проклинаю тот день, когда я начал без разбора преобразовывать ListView в RecyclerView .
источник
Вы можете перевернуть свой список
list.reverse()
и, наконец, позвонитьRecylerView.scrollToPosition(0)
источник