天天看点

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() {

    }
}
           

懒加载就解决了