tablayout+viewpager+fragment懶載入

Liu_ser發表於2018-01-15

原文在簡書:https://www.jianshu.com/p/eb81f3692229

我的是縮減版,只有優化,可以去看原版的。

public abstract class PagerFragment extends Fragment implements View.OnClickListener{
    protected View rootView;



    //當前Fragment是否處於可見狀態標誌,防止因ViewPager的快取機制而導致回撥函式的觸發
    private boolean isFragmentVisible;
    //是否是第一次開啟網路載入
    public boolean isFirst;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (rootView == null)
            rootView = inflater.inflate(getLayoutResource(), container, false);
//        mUnbinder = ButterKnife.bind(this, rootView);
        initView(rootView);
        //可見,但是並沒有載入過
        if (isFragmentVisible && !isFirst) {
            onFragmentVisibleChange(true);
        }
        return rootView;
    }

    //獲取佈局檔案
    protected abstract int getLayoutResource();


    //初始化view
    protected abstract void initView(View rootView);



    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            isFragmentVisible = true;
        }
        if (rootView == null) {
            return;
        }
        //可見,並且沒有載入過
        if (!isFirst&&isFragmentVisible) {
            onFragmentVisibleChange(true);
            return;
        }
        //由可見——>不可見 已經載入過
        if (isFragmentVisible) {
            onFragmentVisibleChange(false);
            isFragmentVisible = false;
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();

    }

    /**
     * 當前fragment可見狀態發生變化時會回撥該方法
     * 如果當前fragment是第一次載入,等待onCreateView後才會回撥該方法,其它情況回撥時機跟 {@link #setUserVisibleHint(boolean)}一致
     * 在該回撥方法中你可以做一些載入資料操作,甚至是控制元件的操作.
     *
     * @param isVisible true  不可見 -> 可見
     *                  false 可見  -> 不可見
     */
    protected void onFragmentVisibleChange(boolean isVisible) {
        loadData();//載入資料
        getclick();//點選事件
    }
    protected abstract void getclick();
    protected abstract void loadData();
}

使用就是用fragment繼承,實現抽象方法,viewpager和tablayout正常執行就可以了。

相關文章