*首先声明我们fragment是否加载的标记
Fragment的View加载完毕的标记
private boolean isViewCreated;
Fragment对用户可见的标记
private boolean isUIVisible;
**
抽Baseframment方法
**
public View onCreateView(@NonNull LayoutInflater inflater,@NonNull ViewGroup container,@NonNull Bundle savedInstanceState) {
View view=View.inflate(getActivity(),oncreateview(),null);
initView(view);
initDate();
return view;
}
**
重写抽象方法
**
protected abstract int oncreateview();
protected abstract void initView(View view);
protected abstract void initDate();
**
在创建这个fragment,把这个fragment设置成可见的
**
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isViewCreated = true;
这里是懒加载的方法
lazyLoad();
}
**
重写视图初始加载的方法
**
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
//isVisibleToUser这个boolean值表示:该Fragment的UI 用户是否可见
if (isVisibleToUser){
//对用户可见的标记 ture
isUIVisible = true;
//进行懒加载
lazyLoad();
} else {
isUIVisible = false;
}
}
**
懒加载方法
**
private void lazyLoad(){
//这里进行双重标记判断,是因为setUserVisibleHint会多次回调,并且会在onCreateView执行前回调,必须确保onCreateView加载完毕且页面可见,才加载数据
if (isViewCreated && isUIVisible) {
loadData();
//数据加载完毕,恢复标记,防止重复加载
isViewCreated = false;
isUIVisible = false;
//Log.i("xx","走了");
}
}
最后要在销毁的方法里进行一次
@Override
public void onDestroy() {
super.onDestroy();
isViewCreated = false;
isUIVisible = false;
//Log.i("xx","销毁");
}
//要准备加载数据的方法
protected abstract void loadData();