1 분 소요


◆View Pager2

view pager를 구현하려면 pagerAdapter을 상속해서 구현을 해주어야 한다. pagerAdapter를 상속해서 구현해놓은 2가지 어댑터(FragmentPagerAdpter와 FragmentStatePagerAdaper)를 제공한다.


FragmentstatePagerAdpater

각 페이지가 프래그먼트로 되어 있을 때 사용하는 어댑터
프래그먼트를 메모리에 생성했다가 필요 없어지면 제거하기 때문에 메모리에 부담이 적다.


◆Viewpager2 사용방법

1. activity_main.xml

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

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
        <com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Monday"/>
        <com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Tuesday"/>
        <com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Wednesday"/>

    </com.google.android.material.tabs.TabLayout>

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tabLayout"/>

</androidx.constraintlayout.widget.ConstraintLayout>

2. FragmentAdapter

class FragmentAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity){
    var fragmentList = listOf<Fragment>()
    override fun getItemCount(): Int {
        return fragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return fragmentList[position]
    }
}
  • FragmentStateAdapter를 사용할때는 FragmentStateAdapter를 상속할 땐 추상 메서드인 createFragment()와 RecyclerView.Adapter의getItemCount()를 반드시 오버라이딩해야한다.

  • createFragment()는 파라미터로 전달받은 특정 position 위치에 연결된 프래그먼트 인스턴스를 생성해서 제공합니다. 그러면 FragmentStateAdapter가 반환된 프래그먼트의 라이프 사이클을 책임집니다

  • getItemCount()는 adapter의 item개수를 리턴합니다. ViewPager2에서의 adapter item은 페이지의 개수이므로 생성될 framgment 인스턴스의 개수를 반환하면 됩니다

2. main activity.kt

class MainActivity : AppCompatActivity() {
    lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        

        val fragmentList = listOf(FragmentA(), FragmentB(), FragmentC())
        val adapter = FragmentAdapter(this)
        adapter.fragmentList = fragmentList
        binding.viewPager.adapter = adapter

        var tabTiles = listOf("A","B","C")
        TabLayoutMediator(binding.tabLayout, binding.viewPager){ //tablayout과 tab 연결
            tab, position -> tab.text = tabTiles[position]
        }.attach()
    }

}

참고문서

android developers

1.pager Adapter

2.ViewPager2

댓글남기기