如下內容來源於網絡收集: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