要想实现Fragment的懒加载首先介绍两个方法:
void setUserVisibleHint(boolean isVisibleToUser)
boolean getUserVisibleHint()
它们分别用作设置/获得Fragment可见状态,我们可以重写Fragment在其中做判断.
public class MyFragment extends Fragment {
private boolean isInit; // 是否可以开始加载数据
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
isInit = true;
return inflater.inflate(R.layout.fragment_my, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
/* 初始化控件 */
}
@Override
public void onResume() {
super.onResume();
// 判断当前fragment是否显示
if (getUserVisibleHint()) {
initViewAndData (); </span>
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
// 每次切换fragment时调用的方法
if (isVisibleToUser) {
initViewAndData();
}
}
/**
* 初始化数据
*/
private void initViewAndData() {
if (isInit) {
isInit = false;//加载数据完成
// 加载各种数据
}
}
}
一般情况下ViewPager与fragment配合使用肯定不止一个fragment,每个fragment都这样不累死。。。不会偷懒的程序猿都不是好猿。
抽取一个BaseFragment出来
public abstract class BaseFragment extends Fragment {
protected View rootView = null;
protected TextView tv_title;
protected EditText et_home_search;
/**
* 是否开始加载
*/
protected boolean isLoad=false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
isLoad=true;
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
/**
* 判断当前fragment是否显示
*/
if(getUserVisibleHint()){
initViewAndData();
}
}
/**
* 初始化布局以及数据
*/
public abstract void initViewAndData();
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
/**
* 每次切换fragment时调用的方法
*/
if(isLoad){
initViewAndData();
}
}
}
使用的时候直接继承BaseFragment,这里需要注意的是重写了
initViewAndData()方法后记得判断一下.
private void initViewAndData() {
if (isInit) {
isInit = false;//加载数据完成
// 加载各种数据
}
}