Подтвердить что ты не робот

Kotlin - Как добавить OnPageChangeListener в ViewPager

Я новичок в kotlin, как я могу добавить OnPageChangeListener в ViewPager.

viewPager?.addOnPageChangeListener // Now how can I add listener to it.
4b9b3361

Ответ 1

Я нашел, что это довольно просто, но мне потребовалось время, поскольку я новичок в котлине. Надеюсь, в один прекрасный день это спасет других.

viewPager?.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {

            override fun onPageScrollStateChanged(state: Int) {
            }

            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {

            }
            override fun onPageSelected(position: Int) {

            }

        })

или мы можем реализовать ViewPager.OnPageChangeListener в нашей Activity или Fragment тогда просто используйте viewPager?.addOnPageChangeListener(this) но обязательно реализуйте переопределенные методы.

Ответ 2

Если вы хотите использовать силу Kotlin еще на один шаг, вы можете упростить использование ViewPager.OnPageChangeListener, создав собственный пользовательский прослушиватель для каждого из трех методов. Каждый прослушиватель обрабатывает одно из действий, определенных в OnPageChangedListener: onPageScrolled(), onPageSelected() and onPageScrollStateChanged(). Обычно вы все равно переопределяете один из методов, и таким образом вы можете быстро добавить реализацию, которая делает то, что вы хотите сделать, не беспокоясь о двух других методах. Это похоже на то, что Butterknife выполнил с помощью аннотаций @OnPageSelected и т.д.

Для этого создайте класс (ы), который вы хотите использовать:

// ViewPagerOnPageSelected.kt
class ViewPagerOnPageSelected(private val pageSelected: (Int) -> Unit = {}) : ViewPager.OnPageChangeListener {

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

    override fun onPageSelected(position: Int) {
        pageSelected(position)
    }

    override fun onPageScrollStateChanged(state: Int) {}
}

// ViewPagerOnPageScrolled.kt
class ViewPagerOnPageScrolled(private val pageScrolled: (Int, Float, Int) -> Unit = { _, _, _ -> }) : ViewPager.OnPageChangeListener {

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
        pageScrolled(position, positionOffset, positionOffsetPixels)
    }

    override fun onPageSelected(position: Int) {}

    override fun onPageScrollStateChanged(state: Int) {}
}

// ViewPagerScrollStateChanged.kt
class ViewPagerScrollStateChanged(private val pageScrollStateChanged: (Int) -> Unit = {}) : ViewPager.OnPageChangeListener {

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

    override fun onPageSelected(position: Int) {}

    override fun onPageScrollStateChanged(state: Int) {
        pageScrollStateChanged(state)
    }
}

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

// MyActivity.kt 
viewPager.addOnPageChangeListener(ViewPagerOnPageSelected([email protected]::onPageSelected))

private fun onPageSelected(position: Int) {
    // add your code here
}

Вы даже можете добавить второго или третьего слушателя

// MyActivity.kt 
viewPager.addOnPageChangeListener(ViewPagerOnPageSelected([email protected]::onPageSelected))
viewPager.addOnPageChangeListener(ViewPagerScrollStateChanged([email protected]::onPageScrollStateChanged))

private fun onPageSelected(position: Int) {
    // add your code here
}

private fun onPageScrollStateChanged(state: Int) {
    // add your code here
}

Kotlin отлично подходит для этого, но он применяется не только к прослушивателю ViewPager, но и для любого интерфейса Android, который требует, чтобы несколько методов были отменены, хотя вы только можете их переопределить.

Примечание. Не забывайте, что слушатель onPageSelected() не получает вызов при первом запуске, поэтому, если вы хотите принять меры на первой странице, вам нужно будет сделать это за пределами этого метода слушателя.

Удачи!!!