package com.example.lazyloadvp.Lazy2;
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;
import java.util.List;
public abstract class LazyFragment extends Fragment {
private View rootView = null;
// view是否被创建
private boolean mIsViewCreated = false;
//是否第一次创建
private boolean mIsFirstVisible = false;
//表示Fragment 不可见状态和再次回到可见状态
private boolean mCurrentVisibleState = false;
public abstract int getLayoutRes();
public abstract void initView(View view);
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(rootView == null){
rootView = inflater.inflate(getLayoutRes(),null);
}
initView(rootView);
mIsViewCreated = true;
//没有隐藏 并且可见 分发状态true
if(!isHidden() && getUserVisibleHint()){
dispatchUserVisibleHint(true);
}
return rootView;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(mIsViewCreated){
if(isVisibleToUser && !mCurrentVisibleState){
dispatchUserVisibleHint(true);
}else if(!isVisibleToUser && mCurrentVisibleState){
dispatchUserVisibleHint(false);
}
}
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(hidden){
dispatchUserVisibleHint(false);
}else {
dispatchUserVisibleHint(true);
}
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
private void dispatchUserVisibleHint(boolean isVisible){
if(isVisible && isParentInvisible()){
return;
}
if(mCurrentVisibleState == isVisible){
return;
}
mCurrentVisibleState = isVisible;
if(isVisible){
if(mIsFirstVisible){
mIsFirstVisible = false;
onFragmentFirstVisible();
}
onFragmentResume();
dispatchChildUserVisibleHint(true);
}else {
onFragmentPause();
dispatchChildUserVisibleHint(false);
}
}
public boolean isParentInvisible(){
Fragment parentFragment = getParentFragment();
if(parentFragment instanceof LazyFragment){
LazyFragment lazyFragment = (LazyFragment) parentFragment;
return !lazyFragment.mCurrentVisibleState;
}
return false;
}
@Override
public void onResume() {
super.onResume();
if(!mIsFirstVisible){
if(!isHidden() && !mCurrentVisibleState && getUserVisibleHint()){
dispatchUserVisibleHint(true);
}
}
}
public void dispatchChildUserVisibleHint(boolean isVisible){
List<Fragment> fragments = getChildFragmentManager().getFragments();
if(fragments != null){
for(Fragment fragment : fragments){
if(fragment instanceof LazyFragment && !fragment.isHidden() && fragment.getUserVisibleHint()){
dispatchUserVisibleHint(isVisible);
}
}
}
}
@Override
public void onPause() {
super.onPause();
if(mCurrentVisibleState && getUserVisibleHint()){
dispatchUserVisibleHint(false);
}
}
public void onFragmentFirstVisible(){
}
public abstract void onFragmentResume();
public void onFragmentPause(){
}
}
考虑两层嵌套,很全面的懒加载Fragment
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 多层嵌套后的 Fragment 懒加载 印象中从 Feed 流应用流行开始,Fragment 懒加载变成了一个大家...
- https://blog.csdn.net/learningcoding/article/details/8004...
- 前言 在项目中我们可能需要获取Fragment可见或者不可见时的回调。(回调这个词在这里用的可能并不准确,这里理解...
- 成长记录-连载(三十六) ——我的第一篇五千字长文,说了什么,你一定想不到 并不是不想每天写公众号,而是之前思考怎...