viewPager嵌套fragment很常用,來一個封裝好的通用adapter。
先建立一個FragmentInstancePagerAdapter,代碼如下:
import 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
)
}
下面是在activity中的使用方法
FragmentInstancePagerAdapter adapter = new FragmentInstancePagerAdapter(getSupportFragmentManager());
adapter.append(ListSpeechFragment.class, "",
() -> ListSpeechFragment.newInstance(detailInfo));
adapter.append(BaseTikTokFragment.class, "",
() -> new MainTikTokFragment());
mViewPager.setAdapter(adapter);
建立fragment,并且可以傳參的工廠方法
public static ListSpeechFragment newInstance(LiveDetailInfo detailInfo) {
ListSpeechFragment f = new ListSpeechFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(KEY_LIVE_DETAIL, detailInfo);
f.setArguments(bundle);
return f;
}
到此結束,簡單好用。