Kotlin - 如何在ViewPager中添加OnPageChangeListener

时间:2017-08-04 18:34:47

标签: android android-viewpager kotlin

我是kotlin的新手,如何在OnPageChangeListener中添加ViewPager

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

4 个答案:

答案 0 :(得分:52)

我发现这很简单,但我花了很多时间,因为我是kotlin的新手。我希望有一天能节省其他人的时间。

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.OnPageChangeListenerActivity中实施Fragment,然后只使用viewPager?.addOnPageChangeListener(this),但请确保实施覆盖的方法。

答案 1 :(得分:2)

对于 ViewPager2 ,您可以使用OnPageChangeCallBack

viewPager?.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
        override fun onPageSelected(position: Int) {
            super.onPageSelected(position)
        }

        override fun onPageScrollStateChanged(state: Int) {
            super.onPageScrollStateChanged(state)
        }

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

答案 2 :(得分:0)

如果您想进一步利用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(this@MyActivity::onPageSelected))

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

您甚至可以添加第二个或第三个听众

// MyActivity.kt 
viewPager.addOnPageChangeListener(ViewPagerOnPageSelected(this@MyActivity::onPageSelected))
viewPager.addOnPageChangeListener(ViewPagerScrollStateChanged(this@MyActivity::onPageScrollStateChanged))

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

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

Kotlin非常适合这一点,但它不仅适用于ViewPager监听器,而且适用于任何需要覆盖多个方法的Android界面,即使您只需要覆盖一个。

注意: 不要忘记在初始启动时不会调用侦听器的onPageSelected(),因此如果您想在第一页上执行操作,则需要在此侦听器方法之外执行此操作。

祝你好运!!!

答案 3 :(得分:0)

由于大多数时候我们只需要覆盖三个ViewPager.OnPageChangeListener方法(通常为onPageSelected)中的一种,所以这可能对减少代码很有用:

viewPager?.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {

    //override only methods you need, not all of them

    override fun onPageSelected(position: Int) {

    }
})