Как определить что ViewPAger достиг края?

250
01 октября 2018, 08:50

Мне необходимо однозначно определить, что ViewPager домотан до конца. Т.е. пользователь "тянет" ViewPager за "край" (надеюсь понятно). В этот момент, я должен заменить текущий фрагмент на новый (с помощью анимации это будет выглядит как перелистывание ViewPager-а). Но вот вопрос: как понять, что ViewPager достиг правого и левого края?

Я пробовал решить задачу с помощью просто математики, вот так:

private fun getViewPagerListener(): OnPageChangeListener {
    return object : OnPageChangeListener {
        override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
            if (position + positionOffset  == 0f) { // first page
                println("LEFT")
            } else if (position + positionOffset == 5f) { // 5th, the last page
                println("RIGHT")
            }
        }
        override fun onPageSelected(position: Int) {
        }
        override fun onPageScrollStateChanged(state: Int) {
        }
    }
}

Но при такой реализации получается большое кол-во ложных срабатываний + из крайних позиций, OnPageChangeListener не всегда отзывается (находясь на 1 вкладке и мотая влево, листенер в 70% не сработает, все зависит от того как положить палец. Аналогичная проблема справа). Если у кого есть идеи, пожалуйста напишите их мне) Спасибо!

Answer 1

Я приведу небольшой прототип, который у меня получился. Идя такая:

Необходимо реагировать только в том случае, когда устанавливается состояние SCROLL_STATE_IDLE (т.е. пользователь только что перестал скроллить ViewPager). Для того, чтобы определить положение "за край" необходимо: во-первых - знать, что мы находимся на одной из крайних вкладок, а во-вторых - знать что пользователь тянет в нужную сторону (за край ViewPager). Если скролим в "край", то состояние ViewPager не измениться, а значит, если предыдущее и текущие состояния равны - пользователь пытается перейти "за край". Реализовал я это так:

private fun getViewPagerListener(): OnPageChangeListener {
    return object : OnPageChangeListener {
        var previousPosition = -1
        var currentPosition = 0
        override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {  }
        override fun onPageSelected(position: Int) {
            currentPosition = position
        }
        override fun onPageScrollStateChanged(state: Int) {
            if(ViewPager.SCROLL_STATE_IDLE == state){
                if (currentPosition == previousPosition) {
                    if (currentPosition == 0) {
                        println("LEFT")
                    } else if (currentPosition == 5) {
                        println("RIGHT")
                    }
                }
            }
            previousPosition = currentPosition
        }
    }
}

Если кто-нибудь знает как решить эту проблему иначе обязательно пишите, сравнимся. К тому же я с большей охотой отдам ответ тому кто предложит красивое решение.

READ ALSO
упал test JUnit geckodriver

упал test JUnit geckodriver

подскажите как поравитьПрошу не кидаться камнями новичок

237
BoxLayout не работает

BoxLayout не работает

Всем приветМне нужно создать окно, в которое автоматически будут добавляться элементы друг под другом (тест, вопросы будут читаться из файла),...

191
Почему не работает calc css?

Почему не работает calc css?

Использую Smart-grid, не работает calc, подскажите почему? Проблема во всех браузерах!!!

251