天天看點

fragment+viewpager的懶加載

之前一直都沒怎麼fragment的懶加載,因為項目中沒有這個需求,新項目準備做一下懶加載

什麼是懶加載:說白了就是我從第一個fragment切換到第二個fragment再去請求資料,并且隻請求一次,之後可以采用下拉重新整理的方式請求,需要使用者自行觸發

為什麼要用懶加載:我們都知道viewpager的

setOffscreenPageLimit(int)

方法可以設定預設加載頁面個數

但是最少也是兩頁,即使你設定

setOffscreenPageLimit(0)

也是沒有用的。

那具體來看看怎麼做吧

既然我們知道viepager預設加載兩個界面,那肯定是可見的時候加載資料了,主要是setUserVisibleHint這個方法

override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)

    }
           

但是這個方法其實并不是在視圖可見就調用,預設是在視圖加載以前調用的,是以直接在裡面設定很有可能空指針

是以我們要設定一個辨別辨別視圖加載完成了,其實就是onViewCreated()這個方法

private var viewCreated = false

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewCreated = true
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser&&viewCreated){
            lazyData()
        }
    }

    private fun lazyData() {

    }
           

這樣基本就完事了

但是這樣是你每次進入這個界面都要去加載資料,是以還是不太好,怎麼設定隻加載一次資料呢,那就更簡單了

隻需要加一個标志位即可

class MyFragment : Fragment() {

    private var viewCreated = false
    private var hasLoadData = false

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewCreated = true
        getDataByLazy(userVisibleHint)
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        getDataByLazy(userVisibleHint)
    }

    private fun getDataByLazy(isVisibleToUser: Boolean) {
        if (isVisibleToUser && viewCreated && !hasLoadData) {
            lazyData()
            hasLoadData = true
        }
    }

    /**
     * 懶加載
     */
    private fun lazyData() {

    }
}
           

懶加載就解決了