在Android中 除了四大组件经常使用(四大组件通信的基础桥梁是Intent)
其实还有一个也是被经常使用 那就是Fragment(比如动态替换,实现多Tab不通效果等)
先说一下Fragment生命周期:
ViewPage 常用的Adapter有 PageAdapter,PageStateAdapter,一般都是复写
getItem
getCount
destoryView
getTitle等
ViewPager有默认缓存机制,缓存两个 比如当前是第二个Fragment 那么第一个和第三个就会被加载,这样如果有网络请求或者有一大堆初始化view findViewById等操作的话体验不是太好,那么解决方法有个setUserVisiab 但是这个被系统调用不一定是什么时机,但是只要视图可见了就会被调用,有可能会被调用两次,那么 我们根据Fragment生命周期,写两个变量,控制视图何时加载数据等操作,从而实现懒加载
setUserVisibleHint是在onCreateView周期前调用
private boolean isViewCreate ; 视图是否被创建
当执行了onCreateView 然后在返回View之前将其变量设置为true;
private boolean isUserVisiable; 是否可见了
当setUserVisibleHint (boolean isVisibleToUser)
方法执行了 并且isVisibleToUser为true,那么将isUserVisiable 设置为true;
然后执行方法 判断这两个变量都是否为true,如果是就加载
if (isInitView && isVisiable)
{
lazyData();
isVisiable = false;
isInitView = false;
}
完整代码:
package com.android.angola.wenna.plus.base;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* 懒加载的Fragment 提高效率
* @author 643200732
* */
public abstract class BaseLazyFragment extends Fragment {
public Context context;
public View rootView;
private boolean isInitView = false;
private boolean isVisiable = false;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (rootView == null)
{
rootView = inflater.inflate(setLayoutId(),container,false);
}
initView(rootView);
isInitView = true;
isCanLoadData();
return rootView;
}
private void isCanLoadData() {
if (isInitView && isVisiable)
{
lazyData();
isVisiable = false;
isInitView = false;
}
}
protected abstract void lazyData();
protected abstract void initView(View rootView);
protected abstract int setLayoutId();
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
{
isVisiable = true;
isCanLoadData();
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
isVisiable = false;
}
}