Мне необходимо однозначно определить, что 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% не сработает, все зависит от того как положить палец. Аналогичная проблема справа). Если у кого есть идеи, пожалуйста напишите их мне) Спасибо!
Я приведу небольшой прототип, который у меня получился. Идя такая:
Необходимо реагировать только в том случае, когда устанавливается состояние 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
}
}
}
Если кто-нибудь знает как решить эту проблему иначе обязательно пишите, сравнимся. К тому же я с большей охотой отдам ответ тому кто предложит красивое решение.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости