之前分享過幾個tab+viewPager的庫。。這種東西開發中特別常見。今天抽空補一個viewPager的adapter。用來搭配使用
創建FragmentInstancePagerAdapter,如下:
mport androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter/*** 為每個類型 Fragment 都只出現一個的 ViewPager 準備的 Adapter** @author* @date*/
class FragmentInstancePagerAdapter(fm: FragmentManager
) : FragmentStatePagerAdapter(fm) {private val list = mutableListOf<AdapterFragmentPager<*>>()inline fun <reified T : Fragment> append(title: CharSequence?,noinline creator: () -> T) {append(T::class.java, title, creator)}/*** 追加一個Fragment* @param clazz Fragment類型的Class* @param title 標題* @param creator 創建該Fragment實例*/fun <T : Fragment> append(clazz: Class<T>,title: CharSequence?,creator: () -> T) {list.add(AdapterFragmentPager(clazz, title, creator))notifyDataSetChanged()}inline fun <reified T : Fragment> indexOfType(): Int {return indexOfType(T::class.java)}/*** 獲取指定類型Fragment的下標*/fun <T : Fragment> indexOfType(clazz: Class<T>): Int {return list.indexOfFirst { it.clazz == clazz }}inline fun <reified T : Fragment> removeByType() {removeByType(T::class.java)}/*** 移除指定類型的Fragment*/fun <T : Fragment> removeByType(clazz: Class<T>) {list.removeAll { it.clazz == clazz }notifyDataSetChanged()}override fun getItem(position: Int): Fragment {return list[position].creator()}override fun getCount(): Int {return list.size}override fun getPageTitle(position: Int): CharSequence? {return list[position].title}override fun getItemPosition(pageFragment: Any): Int {return list.indexOfFirst {it.clazz.isInstance(pageFragment)}}private class AdapterFragmentPager<T : Fragment>(val clazz: Class<T>,val title: CharSequence?,val creator: () -> T)
}
END