Fragment的懶加載

一、前提

在開發(fā)應用的時候,一個Activity里面可能會用Viewpager+多個Fragment來結合使用,如果每個fragment都需要加載數(shù)據(jù),或者從本地加載,或者從網(wǎng)絡加載,那么在這個activity剛創(chuàng)建的時候就需要初始化大量資源,所以我們要做到當切換到這個fragment的時候,才讓它去初始化

二、代碼

LazyFragment.java

public abstract class LazyFragment extends Fragment {
    /**
     * rootView是否初始化標志,防止回調(diào)函數(shù)在rootView為空的時候觸發(fā)
     */
    private boolean hasCreateView;

    /**
     * 當前Fragment是否處于可見狀態(tài)標志,防止因ViewPager的緩存機制而導致回調(diào)函數(shù)的觸發(fā)
     */
    private boolean isFragmentVisible;

    /**
     * onCreateView()里返回的view,修飾為protected,所以子類繼承該類時,在onCreateView里必須對該變量進行初始化
     */
    protected View rootView;

    /* *
     * 在這里實現(xiàn)fragment數(shù)據(jù)的緩加載,此方法是在onCreateView之前調(diào)用
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (rootView == null) {
            return;
        }
        hasCreateView = true;
        if (isVisibleToUser) {
            onFragmentVisibleChange(true);
            isFragmentVisible = true;
            return;
        }
        if (isFragmentVisible) {
            onFragmentVisibleChange(false);
            isFragmentVisible = false;
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initVariable();
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (!hasCreateView && getUserVisibleHint()) {
            onFragmentVisibleChange(true);
            isFragmentVisible = true;
        }
    }

    private void initVariable() {
        hasCreateView = false;
        isFragmentVisible = false;
    }

    /**
     * 當前fragment可見狀態(tài)發(fā)生變化時會回調(diào)該方法
     * 如果當前fragment是第一次加載,等待onCreateView后才會回調(diào)該方法,其它情況回調(diào)時機跟 {@link #setUserVisibleHint(boolean)}一致
     * 在該回調(diào)方法中你可以做一些加載數(shù)據(jù)操作,甚至是控件的操作,因為配合fragment的view復用機制,你不用擔心在對控件操作中會報 null 異常
     *
     * @param isVisible true  不可見 -> 可見
     *                  false 可見  -> 不可見
     */
    protected void onFragmentVisibleChange(boolean isVisible) {

    }
}

FragmentOne.java

public class FragmentOne extends LazyFragment {
    private FragmentLayoutBinding mBinding;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
          if (rootView == null) {
            mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_layout, container, false);
            rootView = mBinding.getRoot();
            ......
       }
        return rootView;
    }
    // isVisible true  不可見 -> 可見
    // isVisible  false 可見  -> 不可見
    @Override
    protected void onFragmentVisibleChange(boolean isVisible) {
        super.onFragmentVisibleChange(isVisible);
      //根據(jù)isVisible做后續(xù)操作
    }


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

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容