Прокрутка RecyclerView до нижней части страницы не вызывает .AddOnScrollListener canScrollVertically - PullRequest
3 голосов
/ 21 февраля 2020

Я пытаюсь реализовать функцию пропуска в моем вертикальном окне повторного просмотра. Когда пользователь нажимает кнопку, recyclerView полностью прокручивается вниз и запускает вызов API. Прямо сейчас, чтобы проверить, находится ли пользователь внизу экрана, я использую .addOnScrollListener в своем обзоре переработчика.

mGridRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);

                //SCROLL_STATE_IDE prevents repeated calls from happening
                // when near bottom of screen and slightly scroll up a bit
                if(!mGridRecycler.canScrollVertically(1) && newState==RecyclerView.SCROLL_STATE_IDLE){
                    Log.d(TAG, "onScrollStateChanged: CALLED WTF");
                    mActivity.getNextPageGridView();
                }
            }
        });

И для реализации функции пропуска до последнего элемента я использую этот метод для кнопки:

mGridRecycler.scrollToPosition(mList.size() - 1);

Переход к последнему элементу, однако вызов API не инициируется, поскольку if-statement не вызывается. Кто-нибудь знает, что я могу заставить его работать успешно?

Ответы [ 4 ]

2 голосов
/ 26 февраля 2020

RecyclerView не знает, как LayoutManager будет обрабатывать прокрутку.
Вы получите вызов onScrolled, только если first и или last дочерняя позиция изменится после макет, вы не получите onScrollStateChanged обратный вызов.

Что делать?

В качестве альтернативы вы можете использовать метод smoothScrollToPosition(..), ИЛИ переопределить onScrolled метод, ИЛИ сделать запрос к вашему API сразу после нажатия кнопки пропустить , что является лучшим решением для вашего сценария.

0 голосов
/ 27 февраля 2020

Для правильной реализации автоматической плавной прокрутки необходимо выполнить следующее:

Объявить постоянную скорости прокрутки:

companion object {
    const val SMOOTH_SCROLL_SPEED = 100f
}

Создать глобальный SmoothScroller param:

private lateinit var smoothScroller: SmoothScroller

В вашем методе init: Инициализируйте объект SmoothScroller:

smoothScroller = object : LinearSmoothScroller(context) {
    override fun getVerticalSnapPreference(): Int {
        return SNAP_TO_START
    }

    override fun calculateSpeedPerPixel(displayMetrics: DisplayMetrics?): Float {
        displayMetrics?.let {
            return SMOOTH_SCROLL_SPEED / it.densityDpi
        }
        return super.calculateSpeedPerPixel(displayMetrics)
    }
}

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

open fun smoothScroll(position: Int) {
    smoothScroller.targetPosition = position
    yourRecycleView.layoutManager.startSmoothScroll(smoothScroller)
}

Надеюсь, что поможет.

0 голосов
/ 27 февраля 2020

Прокрутка Recylerview очень быстрая, поэтому попробуйте задать задержку в 1 сек c с помощью обработчика, или вы также можете использовать

recyclerView.post(() -> mGridRecycler.scrollToPosition(mList.size() - 1);
0 голосов
/ 26 февраля 2020

Он не будет прокручиваться до конца макета, если макет контента имеет верхнее поле или если у вашего элемента есть поле. Я точно не помню, но попробую убрать все поля itemview и contentview. Я решил проблему с небольшим взломом, добавив пустое представление в конец LinearLayout ранее в моем проекте. Надеюсь, это сработает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...