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의 아이템 수와 페이지 간 전환을 처리하는 역할을 수행합니다.
- Fragment 관리: FragmentStateAdapter는 ViewPager2에서 표시할 각 페이지에 해당하는 Fragment를 관리합니다. getItemCount 메서드를 오버라이드하여 전체 페이지 수를 반환하고, createFragment 메서드를 오버라이드하여 해당 위치에 대한 Fragment를 생성합니다.
- 페이지 재사용: FragmentStateAdapter는 ViewPager2의 스크롤 동작에 따라 페이지를 동적으로 로드하고 제거합니다. 현재 표시되지 않는 페이지는 일시적으로 제거되고, 다시 표시되는 경우에 필요한 경우 다시 생성됩니다. 이를 통해 메모리 사용량을 최적화하고 부드러운 스크롤 및 페이지 전환을 제공합니다.
- 생명주기 관리: FragmentStateAdapter는 Fragment의 생명주기 이벤트를 ViewPager2의 생명주기와 연결하여 관리합니다. 이렇게 함으로써 Fragment의 onResume, onPause, onDestroy 등의 메서드를 올바르게 호출할 수 있습니다.
- 데이터 변경 감지: FragmentStateAdapter는 데이터 변경을 감지하고 업데이트된 데이터에 따라 ViewPager2의 페이지를 업데이트합니다. 데이터 변경 시 notifyDataSetChanged 메서드를 호출하면, getItemCount과 createFragment 메서드가 다시 호출되어 페이지를 업데이트합니다.
FragmentStateAdapter를 사용하여 ViewPager2를 구성하려면 다음과 같은 단계를 따릅니다
- FragmentStateAdapter의 하위 클래스를 생성하고, getItemCount과 createFragment 메서드를 오버라이드합니다.
- getItemCount 메서드에서는 전체 페이지 수를 반환합니다.
- createFragment 메서드에서는 해당 위치에 대한 Fragment를 생성하여 반환합니다.
- 생성된 어댑터 객체를 ViewPager2에 설정합니다: viewPager2.adapter = MainFragmentStateAdapter(fragmentActivity).
- 필요에 따라 데이터를 변경하고, 변경을 감지하고자 한다면 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 |