/**
* @Author: 淘跑
* @Date: 2018/7/23 10:41
* @Use:
*/
public class LazyFragment extends Fragment {
private int mType;
/**
* Fragment是否可见状态
*/
public boolean isFragmentVisible;
/**
* 标志位,View是否已经初始化完成。
*/
private boolean isPrepared;
/**
* 是否第一次加载
*/
private boolean isFirstLoad = true;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mType = getArguments().getInt("type");
Log.i("----------------", mType + "onCreate");
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View inflate = inflater.inflate(R.layout.fragment_lazy, container, false);
// 若 viewpager 不设置 setOffscreenPageLimit 或设置数量不够
// 销毁的Fragment onCreateView 每次都会执行(但实体类没有从内存销毁)
isFirstLoad = true;
return inflate;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Log.i("----------------", mType + "onViewCreated");
//界面初始化完成
isPrepared = true;
loadData();
}
/**
* 如果是与ViewPager一起使用,调用的是setUserVisibleHint
*
* @param isVisibleToUser 是否显示出来了
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
onVisible();
} else {
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
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
onVisible();
} else {
onInvisible();
}
}
protected void onInvisible() {
isFragmentVisible = false;
Log.i("----------------", mType + "onInvisible");
}
/**
* 当界面可见的时候执行
*/
protected void onVisible() {
Log.i("----------------", mType + "onVisible");
isFragmentVisible = true;
loadData();
}
/**
* 这里执行懒加载的逻辑
*/
protected void lazyLoad() {
Log.i("----------------", mType + " lazyLoad");
}
private void loadData() {
//判断View是否已经初始化完成 并且 fragment是否可见 并且是第一次加载
if (isPrepared && isFragmentVisible && isFirstLoad) {
isFirstLoad = false;
lazyLoad();
}
}
@Override
public void onDestroy() {
super.onDestroy();
isPrepared = false;
Log.i("----------------", mType + "onDestroy");
}
/**
* Fragment 传值
*
* @return
*/
public static LazyFragment getInstance(int type) {
LazyFragment fragment = new LazyFragment();
Bundle bundle = new Bundle();
bundle.putInt("type", type);
fragment.setArguments(bundle);
return fragment;
}
}
Fragment懒加载:LazyFragment
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 在项目中我们可能需要获取Fragment可见或者不可见时的回调。(回调这个词在这里用的可能并不准确,这里理解...
- 前沿:在使用ViewPager和fragment的时候,如果不了解其运行机制,就会造成网络请求滥用和界面的过度绘制...
- 先来讲一下写这篇文章的原因:就是Fragment懒加载网上的代码弄过来以后配合ViewPager的Fragment...
- Fragment懒加载 封装的支持以下的功能: 1.支持数据的懒加载并且只加载一次 2.提供 Fragment 可...