Skip to content

Instantly share code, notes, and snippets.

@kevivforever
Created May 5, 2019 10:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kevivforever/cfad534306aedc51ef5fd12dc99d74b9 to your computer and use it in GitHub Desktop.
Save kevivforever/cfad534306aedc51ef5fd12dc99d74b9 to your computer and use it in GitHub Desktop.
Tablayout + Viewpager
//with Icon in an activity
private fun setupViewPager() {
val pageAdapter = ViewPagerAdapter(supportFragmentManager)
user_profile_viewpager.adapter = pageAdapter
user_profile_tabLayout.setupWithViewPager(user_profile_viewpager)
user_profile_tabLayout.getTabAt(0)?.setIcon(R.drawable.ic_list_grey_24dp)
user_profile_tabLayout.getTabAt(1)?.setIcon(R.drawable.ic_favorite_border_grey_24dp)
user_profile_tabLayout.getTabAt(2)?.setIcon(R.drawable.ic_add_to_wishlist)
}
class PagerAdapter(fragmentManager: FragmentManager) : FragmentStatePagerAdapter(fragmentManager) {
// Returns total number of pages
override fun getCount(): Int {
return NUM_ITEMS
}
// Returns the fragment to display for that page
override fun getItem(position: Int): Fragment? {
when (position) {
0 // Fragment # 0 - This will show FirstFragment
-> return UserPostsFragment.newInstance()
1 // Fragment # 0 - This will show FirstFragment different title
-> return UserRecommendedFragment.newInstance()
2 // Fragment # 1 - This will show SecondFragment
-> return UserWishListFragment.newInstance()
else -> return null
}
}
// Returns the page title for the top indicator
//Return null if only want icon
override fun getPageTitle(position: Int): CharSequence? {
return null
}
companion object {
private val NUM_ITEMS = 3
}
}
//without Icon in a fragment
private fun setupViewPager() {
childFragmentManager.let {
val adapter = ViewPagerAdapter(it).apply {
addFrag(Fragment1(), getString(R.string.all_posts))
addFrag(Fragment2.newInstance(), getString(R.string.nearby_posts))
addFrag(Fragment3(), getString(R.string.following))
}
fragment_share_viewpager.adapter = adapter
// by default value is 1
fragment_share_viewpager.offscreenPageLimit = 2
// only needed if you want to be aware of fragment curreclty being viewed
fragment_share_viewpager.addOnPageChangeListener(object : androidx.viewpager.widget.ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(p0: Int) {
}
override fun onPageScrolled(p0: Int, p1: Float, p2: Int) {
}
override fun onPageSelected(position: Int) {
}
})
}
}
class ViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager) {
val mFragmentList = ArrayList<Fragment>()
private val mFragmentTitleList = ArrayList<String>()
fun addFrag(fragment: Fragment, title: String) {
mFragmentList.add(fragment)
mFragmentTitleList.add(title)
}
override fun getItem(position: Int): Fragment {
return mFragmentList[position]
}
override fun getCount(): Int {
return mFragmentList.size
}
override fun getPageTitle(position: Int): CharSequence? {
return mFragmentTitleList[position]
}
}
@Zhuinden
Copy link

Zhuinden commented Nov 13, 2019

ViewPagerAdapter implementation is wrong. It should be just like your FragmentStatePagerAdapter implementation.

Never store a list of Fragments inside a FragmentPagerAdapter. See https://stackoverflow.com/questions/58594982/fragment-has-not-been-attached-yet/58605339#58605339

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment