应用场景:使用viewpager和fragment来展示数据,要求滑动到fragment时加载此页面的数据。
解决这个问题其实很简单,fragment里有setUserVisibleHint这个方法,意思是当此fragment可见时执行此方法。所以我们的fragment可以这样写(为了方便起见,我们写一个BaseFragment,需要实现懒加载的继承BaseFragment即可):
public abstract class BaseFragment extends Fragment {
// 第一次可见时的状态
private boolean firstVisible = true;
public boolean isFirstVisible() {
return firstVisible;
}
public void setFirstVisible(boolean firstVisible) {
this.firstVisible = firstVisible;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
// TODO Auto-generated method stub
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// 可见时执行的操作
if (firstVisible) {
firstVisibleInitData();
firstVisible = false;
}
} else {
// 不可见的时候执行操作
}
}
/**
* 第一次可见状态下加载数据的方法(且只会加载一次)
*/
public abstract void firstVisibleInitData();
}
代码很简单,相信大家一目了然。
firstVisible这个变量用来记住第一次可见的状态,这个主要是因为setUserVisibleHint方法每次fragment可见的时候都会执行,而我的需求是第一次执行加载操作。
注意:setUserVisibleHint方法会在onCreateView之前调用,所以在firstVisibleInitData里不要执行ui操作,否则会报空指针错误,毕竟还没初始化。。。