Fragment懶加載

所謂懶加載,即Fragment 的 UI 對用戶可見時才加載數(shù)據(jù)
  • 關鍵方法public void setUserVisibleHint(boolean isVisibleToUser)

具體代碼:

package com.example.uilayout;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by pengshulin on 2017/5/5.
 * <p>
 * 懶加載Fragment
 */

public abstract class LazyLoadFragment extends Fragment {
    /**
     * 控件是否初完成始化
     */
    private boolean isViewCreated;
    /**
     * 是否完成數(shù)據(jù)初始化
     */
    private boolean isLoadDataCompleted;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
//        只需要判斷參數(shù) isVisibleToUser 是否為 True 即可知道該 Fragment 的 UI 是否對用戶可見

        super.setUserVisibleHint(isVisibleToUser);

//        對于單個 Fragment,setUserVisibleHint 是不會被調用的,
//        只有該 Fragment 在 ViewPager 里才會被調用。
//        一個 ViewPager + Fragment 的 Demo,
//        打印了一下 Log可以看到 setUserVisibleHint 的執(zhí)行順序如下
//        setUserVisibleHint: isVisibleToUser = false
//        onAttach
//        onCreate
//        setUserVisibleHint: isVisibleToUser = true
//        onCreateView
//        onActivityCreated
//        onStart
//        onResume
//        onPause
//        onStop
//        onDestroyView
//        onDestroy
//        onDetach

        if (isVisibleToUser && isViewCreated && !isLoadDataCompleted) {
            loadData();
        }
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(getLayoutId(), container, false);

        initView(rootView);
        isViewCreated = true;

        return rootView;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

//        * ViewPager 默認顯示第一頁,第一頁肯定要先加載數(shù)據(jù)啊,
//        * 而且 setUserVisibleHint 的執(zhí)行順序又是在 onCreatView 之前,
//        * 同時 onCreatView 需要初始化界面和修改 isViewCreated 的值。
//        * 所以就需要在 onActivityCreated 里執(zhí)行一次咯。

        if (getUserVisibleHint()) {
            loadData();
        }

    }

    /**
     * 獲取布局id
     *
     * @return
     */
    protected abstract int getLayoutId();

    /**
     * 初始化控件
     *
     * @param rootView
     */
    protected abstract void initView(View rootView);

    /**
     * 加載數(shù)據(jù)
     */
    protected abstract void loadData();
}

參考地址:http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820834&idx=1&sn=694a94615494bfcaed07188e2601724a&scene=23&srcid=0808vHgojfq1vTzIpSDNBhwq#rd

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容