fragment实现懒加载,有几个前提,首先是fragment已经执行了oncreateview方法(isPrepared),其次是fragment可见(isVisiable),最后是fragment需要的数据没有加载过(isNotLoad)。。。最重要的是,你的viewpager得给所有的fragment开启缓存
满足这三个条件,fragment才需要进行懒加载操作。。。
public class DemoFragment extends Fragment{
boolean isPrepared = false;
boolean isVisiable = false;
boolean isNotLoaded = true;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
isPrepared = true;
onLoadData(); //如果这个是viewpager的第一个出现的fragment,需要在createview的时候手动调用一次onLoadData
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()){
isVisiable = true;
onLoadData();
}else {
isVisiable = false;
}
}
public void onLoadData(){
if (!isPrepared || !isNotLoaded || !isVisiable)
return;
getData();
}
public void getData(){
//获取数据
isNotLoaded = false;//或者在数据返回的onsuccess的时候改为true;
}
}
当然你也可以写一个基类,然后只需要复写loadData方法,进行三个参数的判断来进行数据加载。。。这种方法有个不好的地方,数据需要刷新的时候,需要自己手动刷新。。。。解决方法是,用Acache缓存你取到的数据,然后给数据设置过期时间,然后再加一个判断条件,或者把IsNotLoad改成判断数据是否为空,为空切可见切执行过oncreateview就进行数据加载,因为Acache缓存的数据可以设置过期时间,时间过期了,数据就为空了。。。就能再次执行onLoaddata方法了