之前一直都沒怎麼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() {
}
}
懶加載就解決了