viewpage裏fragment懶加載與緩存已經建立的fragment

如下內容來源於網絡收集:java

新聞類應該最多見的就是viewpage,Fragment.數組

懶加載的方式基本都是經過setUserVisibleHint的方式來判斷當前的Fragment是否是可見,可是若是想只有第一次加載數據後面再顯示不加載數據,就必須還要作一些其餘的判斷
下面直接看代碼:緩存

private boolean hasCreateView = false;
 private boolean isFragmentVisible;
 private boolean isFirstVisible;

//setUserVisibleHint()在Fragment建立時會先被調用一次,傳入isVisibleToUser = false
    //若是當前Fragment可見,那麼setUserVisibleHint()會再次被調用一次,傳入isVisibleToUser = true
    //若是Fragment從可見->不可見,那麼setUserVisibleHint()也會被調用,傳入isVisibleToUser = false
    //總結:setUserVisibleHint()除了Fragment的可見狀態發生變化時會被回調外,在new Fragment()時也會被回調
    //若是咱們須要在 Fragment 可見與不可見時乾點事,用這個的話就會有多餘的回調了,那麼就須要從新封裝一個
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        //setUserVisibleHint()有可能在fragment的生命週期外被調用
         if (!hasCreateView) {
            return;
        }

        if (isFirstVisible && isVisibleToUser) {
            onFragmentFirstVisible();
            isFirstVisible = false;
        }
        if (isVisibleToUser) {
            onFragmentVisibleChange(true);
            isFragmentVisible = true;
            return;
        }
        if (isFragmentVisible) {
            isFragmentVisible = false;
            onFragmentVisibleChange(false);
        }
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        //若是setUserVisibleHint()在rootView建立前調用時,那麼
        //就等到View建立完後纔回調onFragmentVisibleChange(true)
        //保證onFragmentVisibleChange()的回調發生在View建立完成以後,以便支持ui操做
        if (!hasCreateView) {
            hasCreateView = true;
           if (getUserVisibleHint()) {
                hasCreateView = true;
                if (isFirstVisible) {
                    onFragmentFirstVisible();
                    isFirstVisible = false;
                }
                onFragmentVisibleChange(true);
                isFragmentVisible = true;
            }
        }

        super.onViewCreated(view, savedInstanceState);
    }

    /** * 去除setUserVisibleHint()多餘的回調場景,保證只有當fragment可見狀態發生變化時纔回調 * 回調時機在view建立完後,因此支持ui操做,解決在setUserVisibleHint()裏進行ui操做有可能報null異常的問題 * * 可在該回調方法裏進行一些ui顯示與隱藏,好比加載框的顯示和隱藏 * * @param isVisible true 不可見 -> 可見 * false 可見 -> 不可見 */
    protected void onFragmentVisibleChange(boolean isVisible) {

    }

    /** * 在fragment首次可見時回調,可在這裏進行加載數據,保證只在第一次打開Fragment時纔會加載數據, * 這樣就能夠防止每次進入都重複加載數據 * 該方法會在 onFragmentVisibleChange() 以前調用,因此第一次打開時,能夠用一個全局變量表示數據下載狀態, * 而後在該方法內將狀態設置爲下載狀態,接着去執行下載的任務 * 最後在 onFragmentVisibleChange() 里根據數據下載狀態來控制下載進度ui控件的顯示與隱藏 */
    protected void onFragmentFirstVisible() {

    }

    protected boolean isFragmentVisible() {
        return isFragmentVisible;
    }

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

    @Override
    public void onDestroy() {
        initVariable();
        super.onDestroy();
    }

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

基本思路就是判斷可是是否是已經view建立好了,是否是顯示了,若是都是那就進行相應的回調markdown

2.若是要進行Fragment的緩存就在adpter裏進行數組保存,而後重寫下面的方法網絡

@Override
    public int getItemPosition(Object object) {
          return POSITION_NONE;
    }

這樣每次加載Fragment的時候都會認爲沒有緩存須要調用getItem方法,這樣就不會受viewPager 的 setOffscreenPageLimit影響,致使不會調用getItem方法ide

相關文章
相關標籤/搜索