前言:
?? ?? ? 關(guān)于懶加載,在網(wǎng)上看的很多方案,都很不錯(cuò)搔体,但總有點(diǎn)小缺憾,比如:
?? ?? ? 1.Fragment第一次創(chuàng)建不加載數(shù)據(jù)
?? ?? ? 2.解決了第一次創(chuàng)建就能加載數(shù)據(jù)的問題半醉,但第一個(gè)Fragment不加載數(shù)據(jù)
? ? ? ? 3.Fragment view其實(shí)未被初始化疚俱,但卻執(zhí)行了加載數(shù)據(jù)的操作,那么當(dāng)數(shù)據(jù)要更新到界面上缩多,就會(huì)出錯(cuò)呆奕。
?? ?? ? 經(jīng)過自己的研究分析,總結(jié)了一下比較完美的解決方案:
首先先分析一下每次切換的時(shí)候瞧壮,F(xiàn)ragment有可能是處于什么樣的狀態(tài):
分為三種情況:? ? ?
說明:當(dāng)viewpager.setOffscreenPageLimit(n),一次加載了所有的fragment.那么只有第一和第二種情況登馒。
當(dāng)viewpager.setOffscreenPageLimit(n),沒有一次加載所有的fragment,那么下面三種情況都有咆槽。
1.第一次被創(chuàng)建????isViewInitiated=false,不加載圈纺,????執(zhí)行onActivityCreated()????isViewInitiated=true; 加載
2.切換后未被銷毀秦忿,再次切換回來重新可見:isViewInitiated=true,加載????不執(zhí)行onActivityCreated()????
3.切換后被銷毀,再次切換回來蛾娶,重新創(chuàng)建:isViewInitiated=true,(但實(shí)際未初始化) 加載(有可能出錯(cuò)) 灯谣,執(zhí)行onActivityCreated(),isViewInitiated=true; 加載
解決方法1:銷毀的時(shí)候onDestoryView() 將isViewInitiated=false;每次切換可見都會(huì)重新刷新數(shù)據(jù)
1.第一次被創(chuàng)建????isViewInitiated=false蛔琅,不加載胎许,????執(zhí)行onActivityCreated()????isViewInitiated=true; isDataInitiated =false,加載 isDataInitiated =true;
2.切換后未被銷毀回來:isViewInitiated=true,不加載????不執(zhí)行onActivityCreated()
3.切換后被銷毀重新創(chuàng)建:isViewInitiated=true,(但實(shí)際未初始化),因?yàn)閕sDataInitiated =true罗售,所以不加載辜窑,執(zhí)行onActivityCreated(),雖然已真正有初始化了寨躁,但是isDataInitiated =true穆碎,所以不加載
即只有第一次創(chuàng)建的時(shí)候回去加載數(shù)據(jù),此后無論切換的時(shí)候是不是重新創(chuàng)建的职恳,都不加載所禀,需要手動(dòng)加載數(shù)據(jù)方面。如:下拉刷新等。
解決方法2:只有首次創(chuàng)建會(huì)加載數(shù)據(jù)色徘,手動(dòng)調(diào)用prepareFetchData()恭金,傳true即可強(qiáng)制刷新
最后,子Fragment只需要繼承父類褂策,實(shí)現(xiàn)抽象方法蔚叨,在fetchData()里做網(wǎng)絡(luò)請(qǐng)求或者其他耗時(shí)操作即可
最后~如果看完本文有點(diǎn)懵的話,可以先閱讀以下幾篇文章尾抑,再回來看可能會(huì)好點(diǎn)~
ViewPager+Fragment LazyLoad最優(yōu)解 - 簡書
謝謝看到這里的小伙伴歇父,第一次寫,沒寫好再愈,請(qǐng)見諒榜苫。撒花~