fragment_生命周期_懒加载

生命周期

待续

懒加载

基类封装版

BaseLazyFragment

AndroidX之前,Tablayout+ViewpagerFragment懒加载的做法都是通过setUserVisibleHint封装到基类中,可以做到每个页面显示UI的情况下,才进行数据请求并显示UI

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment

abstract class BaseLazyFragment : Fragment() {
    //是否第一次加载数据
    private var isLoadData = false
    //是否UI可见
    private var isUiVisible = false
    //是否View创建
    private var isViewCreate = false

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return LayoutInflater.from(context).inflate(getLayout(), container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        isViewCreate = true
        loadData()
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if (isVisibleToUser) {
            isUiVisible = true
            loadData()
        } else {
            isUiVisible = false
        }
    }

    private fun loadData() {
        //未第一次加载 与 UI可见 与 View已创建,则进行加载
        if (!isLoadData and isUiVisible and isViewCreate) {
            loadDataByLazy()
            isUiVisible = false
            isViewCreate = false
            isLoadData = true
        }
    }

    abstract fun getLayout(): Int

    abstract fun loadDataByLazy()
}

Viewpager设置适配器

AndroidX之前,FragmentStatePagerAdapter参数只需要传入supportFragmentManager,但是到AndroidX里,有更方便的懒加载形式,流程记录在后面

        vp.adapter = object : FragmentStatePagerAdapter(
            supportFragmentManager
        ) {
            override fun getItem(position: Int): Fragment = fragments[position]

            override fun getCount(): Int = fragments.size

            override fun getPageTitle(position: Int): CharSequence = titles[position]
        }

        tl.setupWithViewPager(vp)

AndroidX版

Viewpager设置适配器

FragmentStatePagerAdapter设置参数有2个,第一个参数都懂,第二个参数BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT是控制Fragment生命周期,指定当前行为当前Fragment执行resume函数,不会执行第二个Fragment预加载模式,在FragmentonResum()进行处理懒加载业务即可

        vp.adapter = object : FragmentStatePagerAdapter(
            supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
        ) {
            override fun getItem(position: Int): Fragment = fragments[position]

            override fun getCount(): Int = fragments.size

            override fun getPageTitle(position: Int): CharSequence = titles[position]
        }

        tl.setupWithViewPager(vp)

Fragment代码

import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment

class TestFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return LayoutInflater.from(context).inflate(R.layout.test, container, false)
    }

    override fun onResume() {
        super.onResume()
        Log.e("HLP", "Fragment懒加载")
    }
}
发布了5 篇原创文章 · 获赞 0 · 访问量 45
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览