在日常开发当中, 我们经常会用到ViewPager, 通常呢, 我们会继承FragmentPagerAdapter或者FragmentStatePagerAdapter来作为适配器, 为了能实现ViewPager的懒加载, Cover到大多数情况, 所以我们先要了解一下这俩个Adapter的区别在哪里
FragmentPagerAdapter会只会销毁View, 并不会回收Fragment已经Fragment中的变量,
而FragmentStatePagerAdapter在超过缓存位置后, 会彻底销毁View并回收Fragment
这里我先贴上代码
public abstract class BaseFragment extends Fragment {
// 当前是否处于可见状态
private boolean isVisible;
// Fragment中的View是否已经初始化
private boolean isViewInitialized;
// 数据是否已经获取
private boolean isDataInitialized;
// 是否开启懒加载功能
private boolean isLazyLoad;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisible = isVisibleToUser;
if (isDataInitialized) {
return;
}
if (isLazyLoad) {
processLoadData();
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView(view);
isViewInitialized = true;
}
/**
* 初始化View
*/
protected abstract void initView(View view);
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
restoreData(savedInstanceState);
isDataInitialized = true;
}
if (isLazyLoad) {
processLoadData();
} else {
if (savedInstanceState == null && !isDataInitialized) {
fetchData();
isDataInitialized = true;
}
setViewData();
}
}
/**
* 开启懒加载
*/
protected void enableLazyLoad() {
isLazyLoad = true;
}
/**
* 恢复数据
*/
protected abstract void restoreData(Bundle savedInstanceState);
private void processLoadData() {
if (isDataInitialized) {
setViewData();
return;
}
if (isVisible && isViewInitialized) {
fetchData();
isDataInitialized = true;
setViewData();
}
}
/**
* 给控件设置数据
*/
protected abstract void setViewData();
/**
* 获取数据
*/
protected abstract void fetchData();
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
}
@Override
public void onDestroyView() {
super.onDestroyView();
isViewInitialized = false;
}
@Override
public void onDestroy() {
super.onDestroy();
isDataInitialized = false;
}
}