一开始不知道这个方法,用到tablayout+ viewpager,viewpager里面包含的是fragment,有这样的需求就是,每次滑动需要刷新当前页面,百度一看,有两个方法可以实现,1.setUserVisibleHint 2.onHiddenChanged
如果使用的是上面这张viewpager+tablayout 这种方法,用setUserVisibleHint可以有效的实现刷新数据,而onHiddenChanged这个是需要add、show 、hide隐藏这种方法,切不会走生命周期,如果不对请指正,这里讲解的是setUserVisibleHint方法。
来看张fragment生命周期图;
可以先记下!!!
这里用上setUserVisibleHint这个方法,本以为只是一个简单方法,没想到用了之后出现了大问题,
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if(isVisibleToUser){
}
}
如果是true就直接加载数据,按理说是对的啊,自己可以亲自试验一下发现加载了很多数据,还有用可能是没有数据,这是为什么呢,因为setUserVisibleHint方法的生命周期先与oncreate,当setUserVisbleHint把数据加载完了之后,onCreate还没有加载完成,造成问题所在。继续往下走。
当fragment有3的时候,setUserVisibleHint里面的方法执行了什么。
log
执行了3个false1个true,当显示出第一个界面的时候,isVisibleToUser是true。
把onResume一起打印一下。
看下执行过程
先执行setUserVisibleHint --- oncreate1 --onresume1 - oncreate2 - onResume2- oncreate3 -onResume3应该是这样的,刚刚debug就忘了,,自己可以打印一下,
这里的fragment是一个,而不是三个分开的。
其实知道了这些执行的生命周期过程,自认而然就ok了,不管是懒加载还是....都是一个道理。
顺便附上代码
private var isFristResume = true
private var isFristVisble = true
override fun onResume() {
super.onResume()
if (isFristResume){
isFristResume = false
return
}
if (userVisibleHint){
//加载数据
}
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
if(isVisibleToUser){
if (isFristVisble){
isFristVisble = false
//加载数据这里为什么要加载呢,是因为前面的log,三个false和一个true
//第一次初始化的时候会执行一个true,也就是第一个可见的界面,当滑动到第二的界面时候,isFristvisble并不是false还是true,不会执行else,不会加载数据,只有当第二次的时候才会加载。这里只会执行三次,,而是一直会执行else的数据
}else {
//加载数据
}
}
}