yijianlianUI/app/src/main/java/com/yingmao/clash/fragment/FragmentLazy.kt

122 lines
3.8 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.yingmao.clash.ui.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
/**
*
* 若需要采用Lazy方式加载的Fragment初始化内容放到initData实现
* 若不需要Lazy加载则initData方法内留空,初始化内容放到initViews即可
*
* 注意事项 1:
* 如果是与ViewPager一起使用调用的是setUserVisibleHint。
*
* 注意事项 2:
* 如果是通过FragmentTransaction的show和hide的方法来控制显示调用的是onHiddenChanged.
* 针对初始就show的Fragment 为了触发onHiddenChanged事件 达到lazy效果 需要先hide再show
*
* @author tamsiree
* @date 2015/11/21.
*/
abstract class FragmentLazy : Fragment() {
/**
* 是否可见状态
*/
private var isFragmentVisible: Boolean = false
/**
* 标志位View已经初始化完成。
*/
private var isPrepared = false
/**
* 是否第一次加载
*/
private var isFirstLoad = true
lateinit var mContext: FragmentActivity
var rootView: View? = null
private set
override fun onCreateView(layoutInflater: LayoutInflater, viewGroup: ViewGroup?, savedInstanceState: Bundle?): View? {
// 若 viewpager 不设置 setOffscreenPageLimit 或设置数量不够
// 销毁的Fragment onCreateView 每次都会执行(但实体类没有从内存销毁)
// 导致initData反复执行,所以这里注释掉
// isFirstLoad = true;
// 取消 isFirstLoad = true的注释 , 因为上述的initData本身就是应该执行的
// onCreateView执行 证明被移出过FragmentManager initData确实要执行.
// 如果这里有数据累加的Bug 请在initViews方法里初始化您的数据 比如 list.clear();
mContext = this.activity!!
isFirstLoad = true
rootView = inflateView(layoutInflater, viewGroup, savedInstanceState)
return rootView
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
isPrepared = true
lazyLoad()
}
/**
* 如果是与ViewPager一起使用调用的是setUserVisibleHint
*
* @param isVisibleToUser 是否显示出来了
*/
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if (userVisibleHint) {
isFragmentVisible = true
onVisible()
} else {
isFragmentVisible = false
onInvisible()
}
}
/**
* 如果是通过FragmentTransaction的show和hide的方法来控制显示调用的是onHiddenChanged.
* 若是初始就show的Fragment 为了触发该事件 需要先hide再show
*
* @param hidden hidden True if the fragment is now hidden, false if it is not
* visible.
*/
override fun onHiddenChanged(hidden: Boolean) {
super.onHiddenChanged(hidden)
if (!hidden) {
isFragmentVisible = true
onVisible()
} else {
isFragmentVisible = false
onInvisible()
}
}
protected fun onVisible() {
lazyLoad()
}
protected fun onInvisible() {}
/**
* 要实现延迟加载Fragment内容,需要在 onCreateView
* isPrepared = true;
*/
protected fun lazyLoad() {
if (!isPrepared || !isFragmentVisible || !isFirstLoad) {
return
}
isFirstLoad = false
initData()
}
protected abstract fun inflateView(layoutInflater: LayoutInflater, viewGroup: ViewGroup?, savedInstanceState: Bundle?): View
protected abstract fun initView()
protected abstract fun initData()
}