【Kotlin】ViewPagerでスワイプする画面を作る

#はじめに
以前にもViewPagerで画面をスワイプさせるアプリを作ったが（その時はJavaで）、どういう処理だったのか全然思い出せなかった。。。

参考にさせていただいた記事と似たり寄ったりですが、忘れないよう自分なりに記事にします。

#フラグメント
ViewPagerで表示するFragment。
onCreateViewで表示するレイアウトを作成する。
※SampleFragment1のみ載せます。同じようにFragmentクラスを作成すればOK！

```kotlin:MainActivity.kt
class SampleFragment1 : Fragment() {

    val TAG = "BlankFragment"

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        //レイアウトの取得
        val layout = inflater.inflate('表示するレイアウトを設定', container, false)

        //アダプターで作成したBundleからページ番号取得
        val bundle : Bundle? = arguments
        pageNum = bundle?.get("pageNum") as Int

        //レイアウトに何か処理をする場合はここでやる

        //レイアウトをリターン
        return layout
    }
}
```

#アダプター
表示するフラグメントを返す。
FragmentStatePagerAdapterを継承して作成する。

```kotlin:CustomPagerAdapter.kt
class CustomPagerAdapter(_fm: FragmentManager, private val fragmentList: List<Fragment>) :
    FragmentStatePagerAdapter(_fm) {

    // 表示するフラグメントを制御する
    override fun getItem(position: Int): Fragment {

        //表示するページ番号を渡す必要があったのでargumentsにbundleを詰め込んでる
        val bundle : Bundle = Bundle()
        bundle.putInt("pageNum", position)
        fragmentList[position].arguments = bundle

        //fragmentリストから表示するfragmentをリターン
        return fragmentList[position]
    }

    // viewPagerにセットするコンテンツサイズ
    override fun getCount(): Int {
        return fragmentList.size
    }
}
```

#レイアウト
ViewPagerのみの単純なレイアウト。
共通して表示したいレイアウトがある場合、追加する。

```xml:viewpager_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
```

#メイン
ViewPagerで表示するFragmentのリストを作成し、アダプターにセットする。そしてviewpagerレイアウトのアダプターにセットする。

```kotlin:MainActivity.kt
class MainActivity : FragmentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.viewpager_main)

        //fragmentリストを作成
        val fragmentList : MutableList<Fragment> = arrayListOf()
        fragmentList.add(SampleFragment1())
        fragmentList.add(SampleFragment2())

        //adapterのインスタンス生成
        val adapter = CustomPagerAdapter(supportFragmentManager, fragmentList)
        viewPager.adapter = adapter
    }
}
```

以上！！！

あと、ページスワイプ時に処理がしたい場合があったので、それも載っけておきます。
詳細は参考にさせていただいたページを参照ください。

```kotlin:MainActivity.kt
class MainActivity : FragmentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.viewpager_main)

        //fragmentリストを作成
        val fragmentList : MutableList<Fragment> = arrayListOf()
        fragmentList.add(SampleFragment1())
        fragmentList.add(SampleFragment2())

        //adapterのインスタンス生成
        val adapter = CustomPagerAdapter(supportFragmentManager, fragmentList)
        viewPager.adapter = adapter

        /* 下記が追加部分 */
        viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
            override fun onPageSelected(position: Int) {}
            override fun onPageScrollStateChanged(state: Int) {}
            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
        })

    }
}
```
参考
[[kotlin] ViewPagerでフラグメントを切り替える](https://qiita.com/YS-BETA/items/091a84961d5b56fced2b)
[[kotlin] ViewPagerをボタンで切り替える](https://qiita.com/YS-BETA/items/78cb07713ccef60f47e4)
[ViewPagerの基本](https://qiita.com/naoi/items/59c01a2a6eb8420c351c)

#最後に
基本は理解できた！
ただ生成されているフラグメントの更新ができず(フラグメントは3枚まで保持している）、別の方法にシフトしました。
ViewPager2なら簡単にできるのかな～調べてみます。

また、間違っている部分やアドバイスありましたらお願いします。