fragment 懶加載

fragment 的懶加載

  • 懶加載

什么是懶加載:
只有在 fragment 顯示在界面的時(shí)候,才進(jìn)行數(shù)據(jù)的加載

懶加載類別:
不同 fragment 的添加方式,需要采用不同的懶加載處理方法

fragment 添加方式:

  1. replace()
  2. add()/hide()/show()
  3. viewpager + fragment

replace()

/**
 * 以replace()的方式添加fragment到指定布局R.id.layout_fragment
 */
private void showFragment(Fragment fragment) {
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.layout_fragment, fragment);
    transaction.commit();
}

每次均是添加新的 fragment 實(shí)例,數(shù)據(jù)需要重新加載
選擇合適的生命周期即可

add()/hide()/show()

/**
 * 以add()/hide()/show()的方式添加
 * 判斷fragment是否已被添加進(jìn)入fragmentManager
 * 已添加:直接顯示
 * 未添加:指定布局R.id.layout_content,add
 */
private void showFragment(Fragment newFragmeent) {
        if (newFragmeent != currentFrament ) {
            FragmentTransaction transaction = fragmentManager.beginTransaction();
            if (!newFragmeent.isAdded()) {
                 transaction
                .hide(currentFrament)
                .add(R.id.layout_content, newFragmeent)
                .commit();
            } else {
                transaction
               .hide(currentFrament)
               .show(newFragmeent)
               .commit();
            }
            currentFrament = newFragmeent
        }
}
  1. fragment 未被添加進(jìn)入 fragmentManager,采用 add 的方式添加 :

觸發(fā)生命周期 與 replace()的處理方式相同,選擇合適生命周期即可

  1. fragment 已被添加進(jìn)入 fragmentManager,采用 show 的方式:

觸發(fā) onHiddenChanged(boolean hidden) 一般無(wú)需處理加載,數(shù)據(jù)已經(jīng)在 add()時(shí)通過(guò)生命周期加載過(guò)了

/**
 * show()/hide()會(huì)觸發(fā) add()不會(huì)觸發(fā)
 * 此方法只是用于感知show()和hide()
 */
@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if(hidden){
        //TODO now invisible to user
    } else {
        //TODO now visible to user
    }
}

viewpager + fragment

  • 只有在 adapter 是 FragmentPagerAdapter 或 FragmentStatePagerAdapter 才有效果

需要注意的是:
位于 FragmentPagerAdapter 或 FragmentStatePagerAdapter 當(dāng)中的fragment,setUserVisibleHint(boolean isVisibleToUser)的調(diào)用時(shí)機(jī)分為兩種

  1. fragment 實(shí)例化 : 所有生命周期之前
  2. fragment 只是切換顯隱,但并未實(shí)例化 : 顯示或隱藏的時(shí)候
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mHasCreatedView = false;
    mHasLoadedOnce = false;
    isFragmentVisible = false;
}

/**
 * 兩步分別處理兩個(gè)fragment
 * 1. 由不可見切換為可見的fragment
 * 2. 由可見切換為不可見的fragment
 */

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    //通過(guò)mRootView是否為null來(lái)判斷是否已經(jīng)初始化完成(也就是判斷具體是通過(guò)哪一次觸發(fā))
    if (mRootView == null) {
        return;
    }
    //初始化完成,標(biāo)記,代表是由第二種方式觸發(fā)
    mHasCreatedView = true;
    //isVisibleToUser == true,表示fragment由不可見切換為可見
    if (isVisibleToUser) {
      onFragmentVisibleChange(true);
      isFragmentVisible = true;
      changeToVisiable();
      return;
    }
    //可見的fragment由可見切換為不可見
    if (isFragmentVisible) {
      onFragmentVisibleChange(false);
      isFragmentVisible = false;
    }
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ...
    //通過(guò)第一種方式觸發(fā)時(shí),并沒(méi)有進(jìn)行加載數(shù)據(jù)
    if (mHasCreatedView){
      return;
    }
    //進(jìn)行第一種方式觸發(fā)時(shí)的數(shù)據(jù)加載
    if (getUserVisibleHint()) {
       onFragmentVisibleChange(true);
       isFragmentVisible = true;
       changeToVisiable();
    }
}

private void changeToVisiable(){
  //從未加載過(guò),則加載
  if (!mHasLoadedOnce) {
    onLazyLoad();
  }
}

/**
 * 可見性的切換觸發(fā)
 *
 */
protected void onFragmentVisibleChange(boolean isvisible) {

}

/**
 * 懶加載
 */
protected void onLazyLoad() {
    //已經(jīng)加載過(guò),標(biāo)記
    mHasLoadedOnce = true;
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市查吊,隨后出現(xiàn)的幾起案子总寻,更是在濱河造成了極大的恐慌蘸拔,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坤候,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)剪勿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)方庭,“玉大人厕吉,你說(shuō)我怎么就攤上這事酱固。” “怎么了头朱?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵运悲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我项钮,道長(zhǎng)班眯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任烁巫,我火速辦了婚禮署隘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亚隙。我一直安慰自己磁餐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布阿弃。 她就那樣靜靜地躺著诊霹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渣淳。 梳的紋絲不亂的頭發(fā)上脾还,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音入愧,去河邊找鬼鄙漏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棺蛛,可吹牛的內(nèi)容都是我干的泥张。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鞠值,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼媚创!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起彤恶,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钞钙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后声离,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芒炼,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年术徊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了本刽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖子寓,靈堂內(nèi)的尸體忽然破棺而出暗挑,到底是詐尸還是另有隱情,我是刑警寧澤斜友,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布炸裆,位于F島的核電站,受9級(jí)特大地震影響鲜屏,放射性物質(zhì)發(fā)生泄漏烹看。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一洛史、第九天 我趴在偏房一處隱蔽的房頂上張望惯殊。 院中可真熱鬧,春花似錦也殖、人聲如沸土思。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浪漠。三九已至陕习,卻和暖如春霎褐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背该镣。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工冻璃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人损合。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓省艳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嫁审。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跋炕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容