web-dev-qa-db-ja.com

Kotlin-ViewPagerでOnPageChangeListenerを追加する方法

私はkotlinの初心者です。どのようにしてOnPageChangeListenerViewPagerを追加できますか。

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

それは非常にシンプルであることがわかりましたが、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) {

            }

        })
_

または、ActivityまたはFragmentに_ViewPager.OnPageChangeListener_を実装してから、単にviewPager?.addOnPageChangeListener(this)を使用できますが、オーバーライドされたメソッドを実装するようにしてください。

66
Rahul

Kotlinの機能をさらに一歩進めたい場合は、3つのメソッドのそれぞれに独自のカスタムリスナーを作成することで、_ViewPager.OnPageChangeListener_の使用を簡素化できます。各リスナーは、OnPageChangedListener: onPageScrolled(), onPageSelected() and onPageScrollStateChanged()で定義されたアクションの1つを処理します。通常、いずれかのメソッドをオーバーライドするだけであるため、他の2つのメソッドを気にせずに、目的の処理を実行する実装をすばやく追加できます。これは、バターナイフが注釈_@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
}
_

2番目または3番目のリスナーを追加することもできます

_// 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()が呼び出されないことを忘れないでください。したがって、最初のページでアクションを実行する場合は、このリスナーメソッドの外で実行する必要があります。

がんばろう!!!

1
themichaelscott