之前一直都没怎么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() {
}
}
懒加载就解决了