본문 바로가기

안드로이드 앱 스쿨 2기/Android

[10주차 - 수] ViewPager2

ViewPager2

  • ViewPager 를 개선하여 나온 View 이다.
  • ViewPager 는 사라지는 화면을 제거해주는 코드를 개발자가 직접 작성해야 한다.
  • ViewPager 는 좌우로 슬라이드 하는 것만 지원한다.
  • ViewPager2 는 RecyclerView를 상속받는 View 이다. 이에 사라지는 화면을 메모리에서 제거하는 것이 아닌 가지고 있다가 재 사용하기 때문에 메모리를 효율적으로 사용할 수 있다.
  • ViewPage2 는 슬라이드 방향을 다양하게 제공하고 있다.

 

파일 구조

 

1. activity_main.xml

  • viewpager2 를 장착시킴
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textViewMain"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/pager2"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

 

2. MainActivity

 

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

    // 사용할  Fragment들
    val fragment1 = Sub1Fragment()
    val fragment2 = Sub2Fragment()
    val fragment3 = Sub3Fragment()
    val fragment4 = Sub4Fragment()
    val fragment5 = Sub5Fragment()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        activityMainBinding.run{
            pager2.run{
                adapter = MainFragmentStateAdapter(this@MainActivity)

                // 기본이 LAYOUT_DIRECTION_LTR
                // 스크롤 방향을 오른쪽에서 왼쪽으로
                // layoutDirection = ViewPager2.LAYOUT_DIRECTION_RTL

                // 스크롤 방향을 위 에서 아래로
                // orientation = ViewPager2.ORIENTATION_VERTICAL

                // 페이지가 변경될 때...
                registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback(){
                    // position : 현재 보여진 페이지의 번호
                    override fun onPageSelected(position: Int) {
                        super.onPageSelected(position)
                        textViewMain.text = "page selected : $position"
                    }
                })


            }
        }

    }

    // ViewPager2의 어뎁터
    inner class MainFragmentStateAdapter(fragmentActivity: FragmentActivity) : FragmentStateAdapter(fragmentActivity){

        override fun getItemCount(): Int {
            return 5
        }

        // position 번째 Fragment를 반환하여 보여준다.
        override fun createFragment(position: Int): Fragment {
            val resultFragment = when(position){
                0 -> fragment1
                1 -> fragment2
                2 -> fragment3
                3 -> fragment4
                4 -> fragment5
                else -> fragment4
            }
            return resultFragment
        }

    }

}

 


[챗 GPT 설명]

 

FragmentStateAdapter는 ViewPager2와 함께 사용되는 어댑터 클래스로, 각 페이지에 해당하는 Fragment를 관리하고 제공합니다. FragmentStateAdapter는 RecyclerView.Adapter를 확장하며, ViewPager2의 아이템 수와 페이지 간 전환을 처리하는 역할을 수행합니다.

 

  1. Fragment 관리: FragmentStateAdapter는 ViewPager2에서 표시할 각 페이지에 해당하는 Fragment를 관리합니다. getItemCount 메서드를 오버라이드하여 전체 페이지 수를 반환하고, createFragment 메서드를 오버라이드하여 해당 위치에 대한 Fragment를 생성합니다.
  2. 페이지 재사용: FragmentStateAdapter는 ViewPager2의 스크롤 동작에 따라 페이지를 동적으로 로드하고 제거합니다. 현재 표시되지 않는 페이지는 일시적으로 제거되고, 다시 표시되는 경우에 필요한 경우 다시 생성됩니다. 이를 통해 메모리 사용량을 최적화하고 부드러운 스크롤 및 페이지 전환을 제공합니다.
  3. 생명주기 관리: FragmentStateAdapter는 Fragment의 생명주기 이벤트를 ViewPager2의 생명주기와 연결하여 관리합니다. 이렇게 함으로써 Fragment의 onResume, onPause, onDestroy 등의 메서드를 올바르게 호출할 수 있습니다.
  4. 데이터 변경 감지: FragmentStateAdapter는 데이터 변경을 감지하고 업데이트된 데이터에 따라 ViewPager2의 페이지를 업데이트합니다. 데이터 변경 시 notifyDataSetChanged 메서드를 호출하면, getItemCount과 createFragment 메서드가 다시 호출되어 페이지를 업데이트합니다.

FragmentStateAdapter를 사용하여 ViewPager2를 구성하려면 다음과 같은 단계를 따릅니다

  1. FragmentStateAdapter의 하위 클래스를 생성하고, getItemCount과 createFragment 메서드를 오버라이드합니다.
  2. getItemCount 메서드에서는 전체 페이지 수를 반환합니다.
  3. createFragment 메서드에서는 해당 위치에 대한 Fragment를 생성하여 반환합니다.
  4. 생성된 어댑터 객체를 ViewPager2에 설정합니다: viewPager2.adapter = MainFragmentStateAdapter(fragmentActivity).
  5. 필요에 따라 데이터를 변경하고, 변경을 감지하고자 한다면 notifyDataSetChanged 메서드를 호출하여 페이지를 업데이트합니다.

위의 단계를 따르면 FragmentStateAdapter를 사용하여 ViewPager2와 함께 Fragment를 효과적으로 관리하고 페이지를 전환할 수 있습니다.

 


[결과]

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님

 

'안드로이드 앱 스쿨 2기 > Android' 카테고리의 다른 글

[10주차 - 수] TabLayout  (0) 2023.07.02
[10주차 - 수] AppBarLayout  (0) 2023.07.02
[10주차 - 수] Toolbar  (0) 2023.07.02
[10주차 - 수] ActionBarNavigation  (0) 2023.07.02
[10주차 - 수] ActionView  (0) 2023.07.02