懒加载介绍
Fragment懒加载就是当Fragment可见的时候我们再去请求数据显示数据 Fragment的懒加载是解决Fragment配合ViewPager使用时的预加载,
预加载介绍
ViewPager有着预加载机制 默认一次加载当前页面前后两个页面,造成这种提前加载的问题是因为ViewPager内部的缓存机制,ViewPager为了在切换的时候防止出现卡顿的现象,提前把当前Fragment的左右Fragment都会加载好
多说无用直接贴代码:
首先 Fragment+ViewPager+TabLayout 形式
首先是联动
mFragmentViewpager_tab=findViewById(R.id.FragmentViewpager_tab);
mFragmentViewpager_viewpager=findViewById(R.id.FragmentViewpager_viewpager);
final ArrayList<Fragment> fragments = new ArrayList<>();
mList=new ArrayList<>();
mList.add("首页");
mList.add("精选");
mList.add("食品");
mList.add("手机");
mList.add("生鲜");
mList.add("电脑");
mList.add("饮料");
for (int i = 0; i < mList.size() - 1; i++) {
fragments.add(BlankvpFragment.newInstance(mList.get(i)));
mFragmentViewpager_viewpager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@NonNull
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return mList.get(position);
}
});
mFragmentViewpager_tab.setupWithViewPager(mFragmentViewpager_viewpager);
}
然后是 Fragment里面关键代码
首先定义几个参数标识
/**
* 是否初始化过布局
*/
protected boolean initializeUI;
/**
* 当前界面是否可见
*/
protected boolean isVisibleUI;
/**
* 是否加载过数据
*/
protected boolean isLoad ;
onCreateView 设置一下初始化布局
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_blankvp, container, false);
initializeUI = true;
return view;
}
在onActivityCreated中通过isVisibleToUser来判断是否可以去请求数据
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (isVisibleUI){
getData(arguments.getString(ARG_PARAM1));
}
}
在ViewPager 中Fragment 在切换的时候会将左右的Fragment 加载 生命周期还会执行 onResume
然后可变的值是setUserVisibleHint 中的 isVisibleToUser 对用户可见的时候为true 该方法是在Fragment生命周期方法之前执行的
setUserVisibleHint(boolean isVisibleToUser)
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleUI = isVisibleToUser;
Log.d("TAG", "setUserVisibleHint: "+isVisibleToUser);
//判断是否对用户可见
if (isVisibleToUser) {
//多重判断 是否对用户可见 是否初始化ui 是否加载过数据
if (isVisibleToUser && initializeUI && (!isLoad)) {
getData(arguments.getString(ARG_PARAM1));
//加载完成之后设置为flase
isLoad = false;
}
}
}
最后 onDestroyView 的时候 设置初始化ui为flase
@Override
public void onDestroyView() {
super.onDestroyView();
initializeUI = false;
}
这里framgent 懒加载就介绍完毕了