ViewPager2는 내장되어 있는 슬라이드 기능을 통해 새로운 페이지를 보여줌
이 과정에서 새로운 페이지를 보여주기 위한 작업을 담당하는 것이 FragmentStateAdapter임
FragmentStateAdapter
는 Adapter
클래스를 상속받고 있는데 이 Adapter
클래스는 RecyclerView의 Adapter
만들때도 RecyclerView.Adapter를 상속받아 만들었을때의 Adapter
와 동일한 놈임
RecyclerView의 Adapter만들때 내부적으로 ViewHolder를 만들어주었는데 이 FragmentStateAdapter역시 내부적으로 FragmentViewHolder를 지정하게됨
즉, FragmentStateAdapter는 RecyclerView에서 사용되는 Adapter와 비슷한 놈으로 보면 됨
https://developer.android.com/reference/androidx/viewpager2/adapter/FragmentStateAdapter#public-constructors_1
RecyclerView는 Adapter에 ViewHolder를 지정하여 구현되고, ViewPager2도 FragmentStateAdapter에 FragmentViewHolder가 지정되어 구현된다는 것
따라서, RecyclerView와 ViewPager2는 같은 원리로 작동.
ViewPager2의 Adapter를 만들때 FragmentStateAdapter를 구현한다고 했는데, 이때 FragmentStateAdapter가 가진 public method 중 getItemCount()와 createFragment()는 반드시 구현해야함
getItemCount() : FragmentStateAdapter의 public method는 아니다. FragmentStateAdapter가 상속하는 Recyclerview.Adapter 클래스의 public method이다. 해당 Adapter가 가지고 있는 data set 안에서의 전체 아이템 수를 리턴하는 메소드이다.
createFragment() : FragmentStateAdapter의 public method이다. 특정 포지션에 연결된 새로운 Fragment를 제공하는 기능을 가지고 있는 메소드이다.
package My_Library
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.example.kotlin_study.R
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import kotlinx.android.synthetic.main.activity_view_pager2.*
class ViewPager2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_view_pager2)
//ViewPager2와 Adapter연결
val adapter = ViewPager2_Adapter(this, 3)
viewPager2.adapter = adapter
//각 탭들이 눌렸을때 작업할 수 있는 기반 코드
//(없어도 무관하긴함) ViewPager2_tab_layout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabReselected(tab: TabLayout.Tab?) {
// handle tab reselect
}
override fun onTabUnselected(tab: TabLayout.Tab?) {
// handle tab unselect
}
override fun onTabSelected(tab: TabLayout.Tab?) {
// handle tab select
Toast.makeText(applicationContext, "탭 눌림", Toast.LENGTH_SHORT).show()
}
})
//ViewPager와 Tab을 연결
TabLayoutMediator(ViewPager2_tab_layout, viewPager2) { tab, position ->
when (position) {
0 -> tab.text = "탭1" //탭의 이름이 됨
1 -> tab.text = "탭2"
2 -> tab.text = "탭3"
}
}.attach()
}
// 추가 기능 ) back 버튼 클릭시 화면 슬라이드 과거로 이동시키기
override fun onBackPressed() {
if (viewPager2.currentItem == 0) {
super.onBackPressed()
} else {
viewPager2.currentItem = viewPager2.currentItem - 1
}
}
//ViewPager2의 Adapter
class ViewPager2_Adapter(
fragmentActivity: FragmentActivity,
val count: Int
) : FragmentStateAdapter(fragmentActivity) {
override fun getItemCount(): Int {
return 3
}
override fun createFragment(position: Int): Fragment {
if (position == 0) {
return ViewPager2_Fragment1()
} else if (position == 1) {
return ViewPager2_Fragment2()
} else {
return ViewPager2_Fragment3()
}
}
}
}
저는 RadioButtom과 Scroll사용해서 Tablayout을 구현했었는데 이번에 Tablayout과 ViewPager를 사용하려는데 뭔가 글들이 다 어렵게 포스팅 해놓아서 어려움이 많았는데, 너무 잘정리 해주시고 설명도 이해가 쉽고 잘읽혔습니다 너무 잘보고갑니다 감사해요👍