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

    }
}

懒加载就解决了

猜你喜欢

转载自blog.csdn.net/villa_mou/article/details/78928706
今日推荐