Android - Fragment正確使用方法介紹,setUserVisibleHint方法實現數據懶加載


我們在做應用開發的時候,一個Activity里面可能會以viewpager(或其他容器)與多個Fragment來組合使用,而如果每個fragment都需要去加載數據,或從本地加載,或從網絡加載,那么在這個activity剛創建的時候就變成需要初始化大量資源。這樣的結果,我們當然不會滿意。那么,能不能做到當切換到這個fragment的時候,它才去初始化呢?

答案就在Fragment里的setUserVisibleHint這個方法里。

import android.support.v4.app.Fragment;

/**
 * @Title: BaseFragment.java 
 * @Package com.ibanglife.fragment 
 * @Description: TODO 博客:http://www.cnblogs.com/brantliu/
 * @author Brant Liu  lbf1988@qq.com
 * @date 2015-11-2 下午2:56:22 
 * @version V1.0 
 */
public abstract class BaseFragment extends Fragment{
	protected boolean isVisible;
	/**
     * 在這里實現Fragment數據的緩加載.
     * @param isVisibleToUser
     */
	@Override
	public void setUserVisibleHint(boolean isVisibleToUser) {
		super.setUserVisibleHint(isVisibleToUser);
        if(getUserVisibleHint()) {
            isVisible = true;
            onVisible();
        } else {
            isVisible = false;
            onInvisible();
        }
	}
	protected void onVisible(){
        lazyLoad();
    }
    protected abstract void lazyLoad();
    protected void onInvisible(){}
}

  在BaseFragment,我增加了三個方法,一個是onVisiable,即fragment被設置為可見時調用,一個是onInvisible,即fragment被設置為不可見時調用。另外再寫了一個lazyLoad的抽象方法,該方法在onVisible里面調用。你可能會想,為什么不在getUserVisibleHint里面就直接調用呢?

  這么寫是為了代碼的復用。因為在fragment中,我們還需要創建視圖(onCreateView()方法),可能還需要在它不可見時就進行其他小量的初始化操作(比如初始化需要通過AIDL調用的遠程服務)等。而setUserVisibleHint是在onCreateView之前調用的,那么在視圖未初始化的時候,在lazyLoad當中就使用的話,就會有空指針的異常。而把lazyLoad抽離成一個方法,那么它的子類就可以這樣做:

public class ContentFragment extends BaseFragment{
    // 標志位,標志已經初始化完成。
    private boolean isPrepared;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_open_result, container, false);
    //XXX初始化view的各控件
    isPrepared = true;
    lazyLoad();
    return view;
    }
    @Override
    protected void lazyLoad() {
        if(!isPrepared || !isVisible) {
            return;
        }
        //填充各控件的數據
    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM