欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android之Viewpager+Fragment實現(xiàn)懶加載示例

 更新時間:2017年03月08日 11:57:13   作者:xjxmars  
本篇文章主要介紹了Android之Viewpager+Fragment實現(xiàn)懶加載示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

我們在做應用開發(fā)的時候,一個Activity里面可能會以viewpager(或其他容器)與多個Fragment來組合使用。而ViewPager默認會緩存三頁數(shù)據(jù),即:Viewpager每加載一個Fragment,都會預先加載此Fragment左側或右側的Fragment。而如果每個fragment都需要去加載數(shù)據(jù),或從本地加載,或從網絡加載,那么在這個activity剛創(chuàng)建的時候就變成需要初始化大量資源,浪費用戶流量不止,還造成卡頓,這樣的結果,我們當然不會滿意。那么,能不能做到當切換到這個fragment的時候,它才去初始化呢?答案就在Fragment里的setUserVisibleHint這個方法里。

該方法用于告訴系統(tǒng),這個Fragment的UI是否是可見的。所以我們只需要繼承Fragment并重寫該方法,即可實現(xiàn)在fragment可見時才進行數(shù)據(jù)加載操作,即Fragment的懶加載。

代碼如下:

package com.yctime.truelove.fragment;


import android.content.Context;
import android.nfc.Tag;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * 基類Fragment
 */
public abstract class BaseFragment extends Fragment {

  protected View mRootView;
  public Context mContext;
  protected boolean isVisible;
  private boolean isPrepared;
  private boolean isFirst = true;

  public BaseFragment() {
    // Required empty public constructor
  }

  @Override
  public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
//    Log.d("TAG", "fragment->setUserVisibleHint");
    if (getUserVisibleHint()) {
      isVisible = true;
      lazyLoad();
    } else {
      isVisible = false;
      onInvisible();
    }
  }


  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mContext = getActivity();
    setHasOptionsMenu(true);
//    Log.d("TAG", "fragment->onCreate");
  }


  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
               Bundle savedInstanceState) {
    if (mRootView == null) {
      mRootView = initView();
    }
//    Log.d("TAG", "fragment->onCreateView");
    return mRootView;
  }

  @Override
  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
//    Log.d("TAG", "fragment->onActivityCreated");
    isPrepared = true;
    lazyLoad();
  }

  protected void lazyLoad() {
    if (!isPrepared || !isVisible || !isFirst) {
      return;
    }
    Log.d("TAG", getClass().getName() + "->initData()");
    initData();
    isFirst = false;
  }

  //do something
  protected void onInvisible() {


  }

  public abstract View initView();

  public abstract void initData();

}

為了可復用,這里我新建了個BaseFragment,在basefragment,我增加了三個方法,一個是onVisiable,即fragment被設置為可見時調用,一個是onInvisible,即fragment被設置為不可見時調用。另外再寫了一個lazyLoad的抽象方法,該方法在onVisible里面調用。

注意看這個方法:

  protected void lazyLoad() {
    if (!isPrepared || !isVisible || !isFirst) {
      return;
    }
    Log.d("TAG", getClass().getName() + "->initData()");
    initData();
    isFirst = false;
  }

這里我們做了三個判斷,判斷isPrepared和isVisible和isFirst只有全為true,才去執(zhí)行initData()方法加載網絡(或本地)數(shù)據(jù)。

①isPrepared參數(shù)在系統(tǒng)調用onActivityCreated時設置為true,這時onCreateView方法已調用完畢(一般我們在這方法里執(zhí)行findviewbyid等方法),確保 initData()方法不會報空指針異常。

②isVisible參數(shù)在fragment可見時通過系統(tǒng)回調setUserVisibileHint方法設置為true,不可見時為false,這是fragment實現(xiàn)懶加載的關鍵。

③isFirst確保ViewPager來回切換時BaseFragment的initData方法不會被重復調用,initData在該Fragment的整個生命周期只調用一次,第一次調用initData()方法后馬上執(zhí)行 isFirst = false。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論