简体   繁体   English

Kotlin - 如何在 ViewPager 中添加 OnPageChangeListener

[英]Kotlin - How to add OnPageChangeListener in ViewPager

我在科特林是新的,我如何添加OnPageChangeListenerViewPager

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

I found it is quite simple, but it took my time as I am new in kotlin.我发现它很简单,但是因为我是 kotlin 新手,所以花了我一些时间。 I hope it will save others time one day.我希望有一天它会节省其他人的时间。

viewPager?.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {

            override fun onPageScrollStateChanged(state: Int) {
            }

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

            }
            override fun onPageSelected(position: Int) {

            }

        })

or we can implement ViewPager.OnPageChangeListener in our Activity or Fragment then just use viewPager?.addOnPageChangeListener(this) but make sure to implement overrided methods.或者我们可以在我们的ActivityFragment实现ViewPager.OnPageChangeListener然后只使用viewPager?.addOnPageChangeListener(this)但确保实现覆盖的方法。

For ViewPager2 you can do it using OnPageChangeCallBack ,对于ViewPager2,您可以使用OnPageChangeCallBack

viewPager2?.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)
        }
    })

Since most of the times we need to override only one of three ViewPager.OnPageChangeListener 's methods (usually onPageSelected ), this might be useful to reduce the code:由于大多数时候我们只需要覆盖三个ViewPager.OnPageChangeListener方法之一(通常是onPageSelected ),这可能有助于减少代码:

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

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

    override fun onPageSelected(position: Int) {

    }
})

If you'd like to leverage the power of Kotlin one step further, you could simplify usage of the ViewPager.OnPageChangeListener by creating your own custom listener for each of the three methods.如果您想进一步利用 Kotlin 的强大功能,您可以通过为这三种方法中的每一种创建您自己的自定义侦听器来简化ViewPager.OnPageChangeListener的使用。 Each listener handles one of the actions defined in the OnPageChangedListener: onPageScrolled(), onPageSelected() and onPageScrollStateChanged() .每个侦听器处理OnPageChangedListener: onPageScrolled(), onPageSelected() and onPageScrollStateChanged()定义的操作之一OnPageChangedListener: onPageScrolled(), onPageSelected() and onPageScrollStateChanged() Usually you are only overriding one of the methods anyway and this way you can quickly add an implementation that does what you want to do without worrying about the other two methods.通常你只是覆盖了其中一种方法,这样你就可以快速添加一个实现你想做的事情而不必担心其他两种方法。 This is similar to what Butterknife was accomplishing with its annotations @OnPageSelected , etc.这类似于 Butterknife 通过其注释@OnPageSelected等完成的工作。

To do this, create the class(es) you'd like to use:为此,请创建您要使用的类:

// 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)
    }
}

Now that you have your classes (or be honest, the one most used is onPageSelected() , so you could just create that one) you can implement them in your Activity.现在你有了你的类(或者说实话,最常用的是onPageSelected() ,所以你可以创建一个)你可以在你的 Activity 中实现它们。

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

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

You can even add a second or third listener您甚至可以添加第二个或第三个侦听器

// 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 is great for this but it applies not only to the ViewPager listener but for any Android interface that requires multiple methods to be overridden even though you only care to override one. Kotlin 对此非常有用,但它不仅适用于 ViewPager 侦听器,还适用于任何需要覆盖多个方法的 Android 界面,即使您只需要覆盖一个。

Note: Don't forget that the listener's onPageSelected() doesn't get called on the initial startup so if you'd like to take action on the first page you'll need to do it outside of this listener method.注意:不要忘记侦听器的 onPageSelected() 在初始启动时不会被调用,因此如果您想在第一页上执行操作,则需要在此侦听器方法之外执行此操作。

Good luck!!!祝你好运!!!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM