在最近的项目中,用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方。例如你在ViewPager中添加了三个Fragment,当加载ViewPager中第一个Fragment时,它会默认帮你预先加载了第二个Fragment,当你加载第二个Fragment时,它会帮你加载第三个Fragment。这样虽然有时很好,但是用户只需看一个Fragment时,我们就做了一些多余工作加载了第二个Fragment。在这只需要取消Fragment的预加载即可,只有当用户切换到某个Fragment才加载.
实际问题就是这个,第一个页面有”暂停”按钮,点击暂停,该职位就到”已暂停职位”列表,然而进入该模块的时候,前两个fragment已经加载,所以,点”暂停”之后,到第二个页面,需要下拉刷新才会出现该职位
在BaseFragment.java中
protected boolean isVisible;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
// TODO Auto-generated method stub
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
/**
* 可见
*/
protected void onVisible() {
lazyLoad();
}
/**
* 不可见
*/
protected void onInvisible() {
}
/**
* 延迟加载
* 子类必须重写此方法
*/
protected void lazyLoad() {
}
注意:setUserVisibleHint在每次fragment显示与隐藏都会调用,他的调用顺序在onCreateView前面,所以需要一些常量进行判断
“发布中的职位”页面
public class JobManageFra_on extends BaseFragment{
private RefreshListView lv;
ArrayList<JobManagerBean> lists=new ArrayList<JobManagerBean>();
GsonDataBean gsonBean=null;
ArrayList<JobManagerBean> list=new ArrayList<JobManagerBean>();
JobManagerBean bean;
String companyId="";
View view;
RelativeLayout loading;
boolean isPrepared=false;//判定view是否inflater
int i=0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
if(!ProjectUtils.checkNetworkState()){
view=ProjectUtils.inflate(R.layout.loading_page_nonet);
//设置网络
setNet();
}else{
if(null==view){
view=inflater.inflate(R.layout.fragment_job_manage_frag_on, container, false);
init();
initListener();
**requeServer();**
}
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
}}
isPrepared=true;
return view;
}
@Override
protected void lazyLoad() {
super.lazyLoad();
**if(!isVisible) {**
return;
}
pd = ProgressDialog.show(getActivity(), null,
"正在加载,请稍候...");
requeServer();
}
“已暂停的职位”页面
public class JobManageFra_pause extends BaseFragment{
private RefreshListView lv;
GsonDataBean gsonBean=null;
ArrayList<JobManagerBean> list=new ArrayList<JobManagerBean>();
ArrayList<JobManagerBean> lists=new ArrayList<JobManagerBean>();
JobManagerBean bean;
String companyId="";
View view;
boolean isPrepared=false;//判定view是否inflater
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
if(!ProjectUtils.checkNetworkState()){
view=ProjectUtils.inflate(R.layout.loading_page_nonet);
//设置网络
setNet();
}else{
if(view==null){
view=inflater.inflate(R.layout.fragment_job_manage_frag_pause, container, false);
init();
initListener(view);
}
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
}}
isPrepared=true;
return view;
}
@Override
protected void lazyLoad() {
super.lazyLoad();
if(!isPrepared || !isVisible) {
return;
}
pd = ProgressDialog.show(getActivity(), null,
"正在加载,请稍候...");
requeServer();//访问网络请求数据
}
这里需要设置viewPager预加载几个页面,想要到一个页面再获取数据,参数就写0或1,0默认为1
viewPager.setOffscreenPageLimit(1);
setUserVisibleHint优于onCreate调用,所以当onCreate调用完毕setUserVisibleHint就不会触发
所以”发布中的职位”是第一页,进入时先执行lazyLoad()方法,但是view没有inflater,有数据显示的也是空白页,我只能在第一次进入多请求一次数据
网上有方法解决这个问题,但我这边试了一下,不行,所以用这种笨办法
这是防止预加载,进入第一个fragment解决办法
http://www.cnblogs.com/lee0oo0/p/3713391.html