美文网首页
androidx fragment懒加载方案

androidx fragment懒加载方案

作者: 肉某人 | 来源:发表于2019-09-30 10:42 被阅读0次

修改viewpager适配器构造方法

FragmentStatePagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)

其中BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT会让fragment的生命周期默认停在onStart,搭配viewpager使用,只有当前被选中的page会调用onResume

创建BaseFragment.kt 重写onResume方法

package com.****.base

import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment

abstract class BaseFragment<T : ViewDataBinding> : Fragment() {
    lateinit var mActivity: AppCompatActivity
    lateinit var binding: T
    
    //是否懒加载
    var isLazyLoad = true

    //是否加载数据(暂时用于第一次加载判断,以后也许会有其他情况)
    private var isNeedLoad = true

    abstract fun bind(): Int

    abstract fun init()

    override fun onAttach(context: Context) {
        super.onAttach(context)
        logE("BaseFragment", "${this::class.java.simpleName}:onAttach")
    }

    override fun onStart() {
        super.onStart()
        logE("BaseFragment", "${this::class.java.simpleName}:onStart")
    }

    override fun onResume() {
        super.onResume()
        logE("BaseFragment", "${this::class.java.simpleName}:onResume")
        //如果是第一次且是懒加载
        //执行初始化方法
        if (isNeedLoad && isLazyLoad) {
            init()
            //数据已加载,置false,避免每次切换都重新加载数据
            isNeedLoad = false
        }
    }

    override fun onPause() {
        super.onPause()
        logE("BaseFragment", "${this::class.java.simpleName}:onPause")
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        logE("BaseFragment", "${this::class.java.simpleName}:onCreateView")
        binding = DataBindingUtil.inflate(inflater, bind(), container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        logE("BaseFragment", "${this::class.java.simpleName}:onViewCreated")
        if (!isLazyLoad)
            init() 
    }

    fun isBindingInitialized() = ::binding.isInitialized

}

相关文章

网友评论

      本文标题:androidx fragment懒加载方案

      本文链接:https://www.haomeiwen.com/subject/uvycpctx.html