- 使用FragmentStatePagerAdapter
相同点:
两者都会保持当前item(即fragment)和前后的item的状态。
显示当前item的同时,Adapter会提前初始化后一个item,并把当前item的前一个item保存在内存中。
不同点:
在于fragment 存储、恢复、销毁 的方式不同
对滑动过去的页面是否销毁:
例如:依次从左向右有fragment1,fragment2,fragment3三个页面
FragmentPagerAdapter在滑动到fragment3时,fragment1会依次调用onPause()、onStop()、onDestroyView(),再向左滑动到fragment2时,fragment1会调用onCreateView()、onActivityCreated()、onStart()、onResume()。
结论:FragmentPagerAdapter会保留页面的状态,并不会完全销毁掉。
FragmentStatePagerAdapter在滑动到fragment3时,fragment1会依次调用onPause()、onStop()、onDestroyView()、onDestroy()、onDetach()方法,再向左滑动到fragment2时,fragment1会调用onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()。
结论:FragmentStatePagerAdapter会完全销毁滑动过去的item,当需要初始化的时候,会重新初始化页面。
如何选择?
当Viewpager中fragment数量多的时候用FragmentStatePagerAdapter,反之则用FragmentPagerAdapter
实例代码
// 创建FragmentStatePagerAdapter
public class NewsAdapter extends FragmentStatePagerAdapter {
// 设置数据
private ArrayList<ColumnData.Column> mData;
public NewsAdapter(@NonNull FragmentManager fm, ArrayList<ColumnData.Column> data) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
mData = data;
}
@NonNull
@Override
public Fragment getItem(int position) {
// 用到哪个Fragment就创建那个Fragment
return PageFragment.newInstance(mData.get(position).getId(), mData.get(position).getName());
}
// 根据数据集合得到要创建的Fragment的数量
@Override
public int getCount() {
return mData == null ? 0 : mData.size();
}
// 设置title让ViewPager与Tablelayout连动
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return mData.get(position).getName();
}
// 创建方法得到该适配器数据
public ArrayList<ColumnData.Column> getmData() {
return mData;
}
}
被多次创建的Fragment中(PageFragment)
public class PageFragment extends BaseSmartFramgent1<RecommendData> {
/**
*
* @param cloumId 得到ID获取不同页面的数据
* @param name
* @return
* 创建静态的方法返回创建好的Fragment
*/
public static PageFragment newInstance(String cloumId, String name) {
// 创建Fragment
PageFragment pageFragment = new PageFragment();
// 使用Bundle传入数据
Bundle bundle = new Bundle();
bundle.putString(NAME, name);
bundle.putString(KEY_CLOUMID, cloumId);
//
pageFragment.setArguments(bundle);
return pageFragment;
}
// 因为newInstance是静态方法无法直接访问通过setArguments得到数据
@Override
public void setArguments(@Nullable Bundle args) {
super.setArguments(args);
if (args != null) {
mCloum = args.getString(KEY_CLOUMID);
}
}
}
使用
// 得到数据
ArrayList<ColumnData.Column> myColumn = data.getData().getList().getMyColumn();
mNewsAdapter = new NewsAdapter(getChildFragmentManager(), myColumn);
// 设置进入适配器
binding.recoomendVp.setAdapter(mNewsAdapter);
// tablayout与ViewPager连动
binding.recommendSlidingTabLayout.setViewPager(binding.recoomendVp);
网友评论