package net.lacolaco.smileessence.view import android.app.Fragment import android.app.FragmentManager import android.os.Bundle import android.support.v13.app.FragmentPagerAdapter import android.support.v4.view.ViewPager import android.view.ViewGroup import net.lacolaco.smileessence.World import net.lacolaco.smileessence.data.PageInfo import net.lacolaco.smileessence.view.page.PageFragment import java.util.* class MainFragmentPagerAdapter(private val world: World, private val viewPager: ViewPager, fm: FragmentManager) : FragmentPagerAdapter(fm) { private val pages = Collections.unmodifiableList(world.pages.map { Page(it) }) @Suppress("UNCHECKED_CAST") fun getPageFragmentAt(position: Int): PageFragment<*> = pages[position].fragment ?: instantiateItem(viewPager, position) as PageFragment<*> override fun getItem(position: Int): Fragment { val args = Bundle() args.putLong(PageFragment.KEY_WORLD_USER_ID, world.id) args.putInt(PageFragment.KEY_PAGE_POSITION, position) val info = pages[position] assert(info.fragment == null) return info.pageInfo.fragmentClass.newInstance().apply { arguments = args } } override fun getCount(): Int { return pages.size } override fun instantiateItem(container: ViewGroup, position: Int): Any { val info = pages[position] val fragment = super.instantiateItem(container, position) info.fragment = fragment as PageFragment<*> return fragment } override fun destroyItem(container: ViewGroup?, position: Int, `object`: Any?) { throw IllegalStateException("Fragments must not be destroyed by ViewPager") } private class Page(var pageInfo: PageInfo, var fragment: PageFragment<*>? = null) }