Fragment與Viewpager實現懶載入
阿新 • • 發佈:2019-01-29
本文轉載自:http://blog.csdn.net/q844258542/article/details/51525749(非常感謝博主的分享)
專案當中使用到tablayout+viewpager+fragment組合, 也是現在app非常流行的一種設計.
viewpager切換頁面時,讓fragment進行懶載入操作,是比較好的體驗,節省省流量,避免預載入時造成的卡頓現象.
懶載入操作主要使用到fragment 的 setUserVisibleHint() , 及getUserVisibleHint()方法
setUserVisibleHint() 方法在viewpageradapter內部呼叫, 會為fragment 進行賦值, 如果fragment 不可見賦值為false. 反之為true.
getUserVisibleHint() 方法是獲取這個值, 通過fragment 當前是否可見, 來進行載入資料的操作, 這樣就實現了預載入的功能.
- package cn.cibn.haokan.ui.categoryList;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import cn.cibn.haokan.ui.base.ImgBaseFragment;
-
public
- /**
- * Fragment title
- */
- public String fragmentTitle;
- /**
- * 是否可見狀態
- */
- privateboolean isVisible;
- /**
- * 標誌位,View已經初始化完成。
- * 2016/04/29
- * 用isAdded()屬性代替
- * 2016/05/03
-
* isPrepared還是準一些,isAdded有可能出現onCreateView沒走完但是isAdded了
- */
- privateboolean isPrepared;
- /**
- * 是否第一次載入
- */
- privateboolean isFirstLoad = true;
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- // 若 viewpager 不設定 setOffscreenPageLimit 或設定數量不夠
- // 銷燬的Fragment onCreateView 每次都會執行(但實體類沒有從記憶體銷燬)
- // 導致initData反覆執行,所以這裡註釋掉
- // isFirstLoad = true;
- // 2016/04/29
- // 取消 isFirstLoad = true的註釋 , 因為上述的initData本身就是應該執行的
- // onCreateView執行 證明被移出過FragmentManager initData確實要執行.
- // 如果這裡有資料累加的Bug 請在initViews方法裡初始化您的資料 比如 list.clear();
- isFirstLoad = true;
- View view = initViews(inflater, container, savedInstanceState);
- isPrepared = true;
- lazyLoad();
- return view;
- }
- /**
- * 如果是與ViewPager一起使用,呼叫的是setUserVisibleHint
- *
- * @param isVisibleToUser 是否顯示出來了
- */
- @Override
- publicvoid setUserVisibleHint(boolean isVisibleToUser) {
- super.setUserVisibleHint(isVisibleToUser);
- if (getUserVisibleHint()) {
- isVisible = true;
- onVisible();
- } else {
- isVisible = false;
- onInvisible();
- }
- }
- /**
- * 如果是通過FragmentTransaction的show和hide的方法來控制顯示,呼叫的是onHiddenChanged.
- * 若是初始就show的Fragment 為了觸發該事件 需要先hide再show
- *
- * @param hidden hidden True if the fragment is now hidden, false if it is not
- * visible.
- */
- @Override
- publicvoid onHiddenChanged(boolean hidden) {
- super.onHiddenChanged(hidden);
- if (!hidden) {
- isVisible = true;
- onVisible();
- } else {
- isVisible = false;
- onInvisible();
- }
- }
- protectedvoid onVisible() {
- lazyLoad();
- }
- protectedvoid onInvisible() {
- }
- /**
- * 要實現延遲載入Fragment內容,需要在 onCreateView
- * isPrepared = true;
- */
- protectedvoid lazyLoad() {
- if (isPrepared && isVisible && isFirstLoad) {
- isFirstLoad = false;
- initData();
- }
- }
- protectedabstract View initViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);
- protectedabstractvoid initData();
- }