viewpager+fragmentリロード操作

3259 ワード

プロジェクトでtablayout+viewpager+fragmentの組み合わせを使用するのも、現在appで非常に流行しているデザインです.
viewpagerがページを切り替える際、fragmentに怠惰なロード操作をさせることは、比較的良い体験であり、トラフィックを節約し、プリロード時のカートン現象を避ける.
リロード操作は主にfragmentのsetUserVisibleHint()およびgetUserVisibleHint()メソッドに使用されます.
setUserVisibleHint()メソッドはviewpageradapterの内部で呼び出され、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 abstract class LazyFragment extends ImgBaseFragment{
	
	 /**
     * Fragment title
     */
    public String fragmentTitle;
    /**
     *       
     */
    private boolean isVisible;
    /**
     *    ,View       。
     * 2016/04/29
     *  isAdded()    
     * 2016/05/03
     * isPrepared     ,isAdded     onCreateView     isAdded 
     */
    private boolean isPrepared;
    /**
     *        
     */
    private boolean 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
    public void 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
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!hidden) {
            isVisible = true;
            onVisible();
        } else {
            isVisible = false;
            onInvisible();
        }
    }

    protected void onVisible() {
        lazyLoad();
    }

    protected void onInvisible() {
    }

    /**
     *        Fragment  ,    onCreateView
     * isPrepared = true;
     */
    protected void lazyLoad() {
        if (isPrepared && isVisible && isFirstLoad) {
            isFirstLoad = false;
            initData();
        }
    }

    protected abstract View initViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);

    protected abstract void initData();
}