懶加載Fragment

public class LazyFragment extends Fragment {  
    private View mRootView;
    private boolean mIsInited;
    private boolean mIsPrepared;    
      @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mRootView = inflater.inflate(R.layout.fragment_lazy, container, false);
        mIsPrepared = true;
        lazyLoad();
            return mRootView;
    }
            
     public void lazyLoad() {
        if (getUserVisibleHint() && mIsPrepared && !mIsInited) { 
               //異步初始化,在初始化后顯示正常UI
            loadData();
        }
    }
               
     private void loadData() {
         new Thread() {
         public void run() {
                //1. 加載數(shù)據(jù)
                //2. 更新UI
                //3. mIsInited = true
            }
        }.start();
    }   
   
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) { 
           super.setUserVisibleHint(isVisibleToUser);
            if (isVisibleToUser) {
            lazyLoad();
        }
    }
   
    public static LazyFragment newInstance() {
           return new LazyFragment();
    }
}

注意點(diǎn):

在Fragment中有兩個(gè)變量控制是否需要做數(shù)據(jù)加載:

  • mIsPrepared:表示UI是否準(zhǔn)備好,因?yàn)閿?shù)據(jù)加載后需要更新UI,如果UI還沒有inflate,就不需要做數(shù)據(jù)加載,因?yàn)閟etUserVisibleHint()會(huì)在onCreateView()之前調(diào)用一次,如果此時(shí)調(diào)用,UI還沒有inflate,因此不能加載數(shù)據(jù)。

  • mIsInited:表示是否已經(jīng)做過數(shù)據(jù)加載,如果做過了就不需要做了。因?yàn)閟etUserVisibleHint(true)在界面可見時(shí)都會(huì)調(diào)用,如果滑到該界面做過數(shù)據(jù)加載后,滑走,再滑回來,還是會(huì)調(diào)用setUserVisibleHint(true),此時(shí)由于mIsInited=true,因此不會(huì)再做一遍數(shù)據(jù)加載。

  • lazyLoad():懶加載的核心類,在該方法中,只有界面可見(getUserVisibleHint()==true)、UI準(zhǔn)備好(mIsPrepared==true)、過去沒做過數(shù)據(jù)加載(mIsInited==false)時(shí),才需要調(diào)loadData()做數(shù)據(jù)加載,數(shù)據(jù)加載做完后把mIsInited置為true。

布局XML主要分兩個(gè)container,一個(gè)是初始顯示的狀態(tài),即R.id.container_empty,當(dāng)數(shù)據(jù)加載完成,就顯示R.id.container:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/container_empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="正在加載"
            />

    </RelativeLayout>
    <RelativeLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone"
        >
        ...
    </RelativeLayout>
</FrameLayout>

《Android基礎(chǔ):Fragment,看這篇就夠了》
https://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653579375&idx=1&sn=4f80a50961329e19cad6cd0e1bff20d9&chksm=84b3ba68b3c4337e28a870d6338fa3035d299a2aff2f3bf3f82304417aa7a83deab0b95031e6&mpshare=1&scene=24&srcid=1109JSBYaqYQZDGpV9sLDjIQ#rd

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容