天天看點

Android中ViewPage+Fragment的預加載的取消

在最近的項目中,用到ViewPager+Fragment,但是Fragment有個不好或者太好的地方。例如你在ViewPager中添加了三個Fragment,當加載ViewPager中第一個Fragment時,它會預設幫你預先加載了第二個Fragment,當你加載第二個Fragment時,它會幫你加載第三個Fragment。這樣雖然有時很好,但是使用者隻需看一個Fragment時,我們就做了一些多餘工作加載了第二個Fragment。在這隻需要取消Fragment的預加載即可,隻有當使用者切換到某個Fragment才加載.

Android中ViewPage+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