在最近的項目中,用到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=;
@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
setUserVisibleHint優于onCreate調用,是以當onCreate調用完畢setUserVisibleHint就不會觸發
是以”釋出中的職位”是第一頁,進入時先執行lazyLoad()方法,但是view沒有inflater,有資料顯示的也是空白頁,我隻能在第一次進入多請求一次資料
網上有方法解決這個問題,但我這邊試了一下,不行,是以用這種笨辦法
這是防止預加載,進入第一個fragment解決辦法
http://www.cnblogs.com/lee0oo0/p/3713391.html