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

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

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

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

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

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

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

Большое спасибо!

Solutions Collecting From Web of "(Smooth) ScrollToPosition не работает должным образом с RecyclerView"

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

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

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

 public class CustomLayoutManager extends LinearLayoutManager { private static final float MILLISECONDS_PER_INCH = 50f; private Context mContext; public CustomLayoutManager(Context context) { super(context); mContext = context; } @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, final int position) { LinearSmoothScroller smoothScroller = new LinearSmoothScroller(mContext) { //This controls the direction in which smoothScroll looks //for your view @Override public PointF computeScrollVectorForPosition (int targetPosition) { return CustomLayoutManager.this .computeScrollVectorForPosition(targetPosition); } //This returns the milliseconds it takes to //scroll one pixel. @Override protected float calculateSpeedPerPixel (DisplayMetrics displayMetrics) { return MILLISECONDS_PER_INCH/displayMetrics.densityDpi; } }; smoothScroller.setTargetPosition(position); startSmoothScroll(smoothScroller); } } 

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

 CustomLayoutManagerlayoutManager = new CustomLayoutManager(getActivity()); recyclerView.setLayoutManager(layoutManager); recyclerView.smoothScrollToPosition(position); 

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

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

 recyclerView.scrollToPosition(position) 

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

 private static final float MILLISECONDS_PER_INCH = 50f; 

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

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

 edittext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { rv_commentList.postDelayed(new Runnable() { @Override public void run() { rv_commentList.scrollToPosition(rv_commentList.getAdapter().getItemCount() - 1); } }, 1000); } }); 

В моем случае,

 `mRecyclerView.scrollToPosition(10);` 

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

 `mRecyclerView.smoothScrollToPosition(10);` 

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

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

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

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

 mRecyclerView.getLayoutManager().scrollToPosition(desiredPosition); 

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