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;
}
到此结束,简单好用。