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

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

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

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

該方法用于告訴系統(tǒng),這個Fragment的UI是否是可見的。所以我們只需要繼承Fragment并重寫該方法,即可實(shí)現(xiàn)在fragment可見時才進(jìn)行數(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();

}

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

注意看這個方法:

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

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論