参考:http://blog.csdn.net/maosidiaoxian/article/details/38300627
先上代码:
父类
public abstract class BaseFragment extends Fragment {
public View rootView;
protected boolean isVisible;
protected boolean isFragmentOk;
protected boolean mHasLoadedData;
/**Fragment 显示或隐藏 时被调用*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
/**
* 可见
*/
protected void onVisible() {
LoadData();
}
/**
* 不可见
*/
protected void onInvisible() {
}
/**
* 延迟加载
* 子类必须重写此方法
*/
protected abstract void LoadData();
}
每个子类的实现方式套路:
public class MyFragment extends BaseFragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mContext = getActivity();
if (mRootView == null) {
mRootView = inflater.inflate(R.layout.main_money, null);
/%%%% 加载视图,比如 maxText = (TextView) mRootView.findViewById(R.id.max_txt); %%% /
isFragmentOk = true;
LoadData();
}
// 缓存的rootView需要判断是否已经被加过parent,
// 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。
ViewGroup parent = (ViewGroup) mRootView.getParent();
if (parent != null) {
parent.removeView(mRootView);
}
return mRootView;
}
@Override
protected void LoadData() {
// TODO Auto-generated method stub
//如果 Fragment 没有加载完毕 ,视图不可见, 数据已经加载,就不加载了
if (!isFragmentOk || !isVisible || mHasLoadedData) {
return;
}
/* if (isonActivityResult) {
return;
}*/
// Log.i("onResume", "onResume");
//获取用户具体信息
/%%%%%%%%% 注释 ① 这里加载耗时的数据(比如:网络数据) %%%%%%%%%%%%%%/
}
}
以上这个套路就能解决预加载数据的问题。
以下为个人讲解:
比如三个Fragment 分别为 A ,B,C. 嵌套在ViewPage 中。
1、前提
setUserVisibleHint()优先于oncreateView()方法。 oncreateView()只会在首次建立或者是预加载的时候调用。 比如 显示A ,预加载B ,那么会调用B的 oncreateView()
但是现在切到B , 显示B 。 那么B的 oncreateView()就不会再调用了。 但是setUserVisibleHint()会在预加载和切换时每次都调用。
2、这个套路实现的目的是,当我显示是A 时,B 会预加载,当时通过变量 isVisible 可得出B是未显示。那么就不进行B 的 数据加载(见代码中的注释 ①),但是视图oncreateView 是依然会加载的。这样就是视图先加载完毕。 切换到B时,再加载数据。
3、在 oncreateView() 中又调用了一次 LoadData()的目的是: 第一次加载视图 (比如 第一个fragment 并不会预加载,而且setUserVisibleHint 优先于oncreateView 调用,setUserVisibleHint 去调用数据加载时 oncreateView 还未调用。而数据加载完成后一般都会填写到View中,这时可能还未加载View,这样就出现空指针的错误。所以有变量 isFragmentOk 来标示。 这样 setUserVisibleHint 去调用数据的时候,会return掉,然后就需要在 oncreateView 中去调用数据了