Scrolltoposition android не работает

(Smooth) ScrollToPosition не работает должным образом с RecyclerView

Я использую базовый RecyclerView с GridLayoutManager. Я заметил, что ни smoothScrollToPosition, ни scrollToPosition не работают должным образом.

smoothScrollToPosition ) при использовании smoothScrollToPosition я часто получаю ошибку от RecyclerView

«RecyclerView: пройденное положение цели при плавной прокрутке».

И RecyclerView не прокручивается должным образом (часто он пропускает целевую строку). Это наблюдается в основном, когда я пытаюсь прокрутить до 1-го элемента некоторой строки

Б) при использовании scrollToPosition он работает нормально, но большую часть времени я вижу только первый элемент строки, а остальные не отображаются.

Можете ли вы дать мне несколько советов, как правильно работать, по крайней мере, один из методов?

Наконец, я смог заставить его работать! LinearLayoutManager.scrollToPositionWithOffset(int, int) сделал трюк.

У меня тоже такая же проблема, но мне удалось исправить эту проблему, настроив SmoothScroller

Пусть Custom LayoutManager, как показано ниже

(Документация прокомментирована внутри приведенного выше кода). Установите вышеописанный LayoutManager для повторного просмотра

С помощью настраиваемого менеджера макетов

ScrollToPosition также хорошо работает в моем случае, вы можете использовать

Также, если вы хотите настроить скорость smoothScrollToPosition, пожалуйста, переопределите

В CustomLayoutManager. Поэтому, если мы поместим значение как 1f, то smoothScrollToPosition будет быстрее, чем scrollToPosition.increasing значение make delay и убывание сделает скорость прокрутки. Надеюсь, это будет полезно.

Чтобы прокрутить вниз до любой позиции в RecyclerView, нажмите EditText.

Тоже не работает. Но

Отлично работает для меня …

Вызов recyclerView smoothScroll неэффективен, так как сам recyclerView не обрабатывает его макет.

То, что вы должны сделать, это вызов метода прокрутки менеджера компоновки вместо этого.

Это должно выглядеть примерно так

Попробуйте измерить ширину или высоту элемента и вызовите smoothScrollBy (int dx, int dy).

Источник

(Smooth)ScrollToPosition не работает должным образом с RecyclerView

Я использую базовый RecyclerView с GridLayoutManager. Я заметил, что ни smoothScrollToPosition ни scrollToPosition работает правильно.

a) при использовании smoothScrollToPosition Я часто получаю ошибку RecyclerView

«RecyclerView» прошел через целевую позицию при плавной прокрутке.»

и RecyclerView прокручивается неправильно (часто он пропускает целевую строку). Это наблюдается в основном, когда я пытаюсь прокрутить до 1-го пункта некоторых row

b) при использовании scrollToPosition это, кажется, вполне нормально работать, но большую часть времени я вижу только 1-й элемент строки, а остальные не отображаются.

можете ли вы дать мне несколько советов, как заставить работать правильно хотя бы один из методов?

6 ответов

наконец-то я смог заставить его работать! LinearLayoutManager.scrollToPositionWithOffset(int, int) сделал свое дело.

у меня также есть такая же проблема, но мне удалось исправить эту проблему, настроив SmoothScroller

Читайте также:  Main файл что это андроид

пусть пользовательский LayoutManager, как показано ниже

(документация прокомментирована внутри кода, приведенного выше)пожалуйста, установите вышеуказанный LayoutManager в recyerview

С помощью пользовательского макета менеджер

scrollToPosition также хорошо работает в моем случае вы можете использовать

также, если вы хотите отрегулировать скорость smoothScrollToPosition пожалуйста, переопределите

в CustomLayoutManager. Поэтому, если мы поставим значение как 1f smoothScrollToPosition будет быстрее, как scrollToPosition.увеличение значения делает задержку и уменьшение сделает скорость прокрутки. Надеюсь, это будет полезно.

Источник

[SOLVED] RecyclerView: scrollToPosition not working

  • Posted by Finco Agbontaen
  • 1 Comment
  • Categories: Android Apps, Android Errors & Solutions, Tutorials

Sometimes when working on an android app, you might need to programmatically scroll a RecyclerView to a position. For example a chat screen. That’s when the recyclerView.scrollToPosition() method comes in.

However, this method sometimes does not work and will simply do nothing.

Cause

The are several reasons that can cause the scrollToPosition() method to not work, however I will describe just one of the reasons in this post

Setting layoutManager.setReverseLayout(true)

According to the docs here:

Used to reverse item traversal and layout order. This behaves similar to the layout change for RTL views. When set to true, first item is laid out at the end of the UI, second item is laid out before it etc. For horizontal layouts, it depends on the layout direction. When set to true, If RecyclerView is LTR, than it will layout from RTL, if RecyclerView> is RTL, it will layout from LTR. If you are looking for the exact same behavior of setStackFromBottom(boolean) , use setStackFromEnd(boolean)

So basically, when you reverse the RecyclerView’s layout, the indexes of the RecyclerView also reverses.

Solution

The solution depends on the exact cause of the problem.

  • If the cause is due to setReverseLayout(true) being set, then you can easily solve the problem by simply making sure that the index you pass to recyclerView.scrollToPosition() is not greater than the list size – 1.Also, if you are trying to scroll to the end of the list, you should pass 0 to the scrollToPosition() method instead of the length of the list – 1.
  • If the cause of the issue is unknown, then this solution is for you.Up till now, I have not had the time to debug the RecyclerView class in order to figure out why this method fails at times, however, the RecyclerView.smoothScrollToPosition(position); method seems to always work in all scenarios.

And that’s all for now.

If you have any questions or contributions, feel free to post them in the comment box below

Читайте также:  Как расширить память планшета андроид

Источник

Как прокручивать дно RecyclerView? ScrollToPosition не работает

Я хотел бы прокрутить список в списке RecyclerView после загрузки активности.

conversationView.scrollTo(. ) выдает исключение из-за того, что не поддерживается в RecyclerView, а conversationView.scrollToPosition(. ) , похоже, ничего не делает.

После вышеописанного блока кода я добавил

Который не работает. В GENERIC_MESSAGE_LIST имеется 30 элементов.

Просто установите setStackFromEnd=true или setReverseLayout=true чтобы LLM закончила элементы макета.

Разница между этими двумя заключается в том, что setStackFromEnd установит представление для отображения последнего элемента, направление макета останется прежним. (Таким образом, в горизонтальном представлении Recycler влево-вправо будет показан последний элемент и прокрутка влево покажет более ранние элементы)

Если setReverseLayout изменит порядок элементов, добавленных адаптером. Макет начнется с последнего элемента, который будет самым левым в LTR Recycler View, а затем прокрутка вправо отобразит более ранние элементы.

Подробнее см. Документацию .

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

Что я использовал?

… что РАБОТАЕТ ?

Я знаю, что он опоздал, чтобы ответить здесь, но если кто-то хочет знать решение ниже

Когда вы вызываете setAdapter , это не сразу setAdapter и не позиционирует элементы на экране (который принимает один проход макета), поэтому ваш scrollToPosition() не имеет фактических элементов для прокрутки, когда вы его вызываете.

Вместо этого вы должны зарегистрировать ViewTreeObserver.OnGlobalLayoutListener (через addOnGlobalLayoutListner () из ViewTreeObserver созданный conversationView.getViewTreeObserver() ViewTreeObserver conversationView.getViewTreeObserver() ), который задерживает ваш scrollToPosition() до тех пор, пока не пройдет первый переход макета:

Скроллинг от любой позиции в recyclerview до дна

Выше кода работает, но он не гладкий и не крутой.

Если у вас есть адаптер, подключенный с помощью recyclerView, просто сделайте это.

Только ответ Яна смог сделать прокрутку RecyclerView в указанной позиции. Тем не менее, RecyclerView не смог прокручивать потом, когда я использовал scrollToPosition() . smoothScrollToPosition() но начальная анимация сделала это слишком медленно, когда список был длинным. Причина в том, что слушатель не был удален. Я использовал код ниже, чтобы удалить текущий ViewTreeObserver и он работал как прелесть.

Ответ Рока – отличная помощь. Я хотел бы добавить к нему небольшой блок:

Источник

Как прокрутить до нижней части RecyclerView? scrollToPosition не работает

Я хочу прокрутить список в списке RecyclerView после загрузки активности.

conversationView.scrollTo(. ) выдает исключение из-за того, что не поддерживается в RecyclerView, а conversationView.scrollToPosition(. ) ничего не делает.

После вышеописанного блока кода я добавил

который не работает. В GENERIC_MESSAGE_LIST есть 30 элементов.

Просто установите setStackFromEnd=true или setReverseLayout=true , чтобы LLM закончил элементы макета.

Разница между этими двумя заключается в том, что setStackFromEnd установит представление для отображения последнего элемента, направление макета останется прежним. (Таким образом, в горизонтальном представлении Recycler влево-вправо будет показан последний элемент, а прокрутка влево отобразит предыдущие элементы)

Читайте также:  Лего май сити для андроид

В то время как setReverseLayout изменит порядок элементов, добавленных адаптером. Макет будет начинаться с последнего элемента, который будет самым левым в LTR Recycler View, а затем, прокручивая вправо, отобразит более ранние элементы.

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

Что я использовал?

… что РАБОТАЕТ?

Я знаю, что он опоздал, чтобы ответить здесь, но если кто-то хочет знать решение ниже

Для прокрутки из любой позиции в recyclerview до нижней

Когда вы вызываете setAdapter , это не сразу выставляет и позиционирует элементы на экране (который принимает один проход макета), поэтому ваш вызов scrollToPosition() не имеет фактических элементов для прокрутки, когда вы его вызываете.

Вместо этого вы должны зарегистрировать ViewTreeObserver.OnGlobalLayoutListener (через addOnGlobalLayoutListner() из ViewTreeObserver , созданного conversationView.getViewTreeObserver() ), который задерживает ваш scrollToPosition() до тех пор, пока не пройдет первый макет:

Добавьте этот код после отправки сообщения и до получения сообщения с сервера

выше код работает, но он не гладкий и не крутой.

ЕСЛИ у вас есть адаптер, подключенный с помощью recyclerView, просто сделайте это.

В моем случае, когда представления не имеют одинаковую высоту, вызов scrollToPosition в LayoutManager работал для того, чтобы действительно прокрутить до конца и полностью увидеть последний элемент:

Решение для Котлина:

применять нижеприведенный код после установки “recyclerView.adapter” или после “recyclerView.adapter.notifyDataSetChanged()”

Ответ Roc – отличная помощь. Я хотел бы добавить к нему небольшой блок:

Это отлично работает для меня:

Только ответ Яна смог сделать мой RecyclerView прокруткой до указанной позиции. Тем не менее, RecyclerView не смог прокручивать потом, когда я использовал scrollToPosition() . smoothScrollToPosition() работал, но первоначальная анимация сделала слишком медленным, когда список был длинным.
Причина в том, что слушатель не был удален. Я использовал код ниже, чтобы удалить текущий ViewTreeObserver , и он работал как прелесть.

этот код даст вам последнее сообщение первым, я думаю, что этот ответ полезен.

Пробовал метод @galex, он работал до рефакторинга. Поэтому я использовал ответ @yanchenko и немного изменился. Вероятно, это потому, что я вызвал прокрутку из onCreateView() , где было построено представление фрагментов (и, вероятно, не имело правильного размера).

Вы также можете добавить проверку viewTreeObserver.isAlive как в qaru.site/questions/18473/….

Прокрутка в первый раз при первом входе в представление рециркулятора, а затем используйте linearLayoutManager.scrollToPositionWithOffset(messageHashMap.size() -1, для прокрутки вниз для прокрутки вверх положите положительное значение в минус);

если вид очень большой по высоте, то для верхней части вида используется конкретное смещение scrolltoposition, тогда вы используете

Источник

Оцените статью