ViewPager嵌套Fragment时实现懒加载

一、为什么要懒加载
ViewPager 嵌套 Fragment 使用时, 所有Fragment 会被创建,无论是否对用户可见,都会调用接口加载数据,显然浪费流浪跟内存。
二、如何实现懒加载

// A code block
/**
 * <p></p>
 * <p></p>
 *
 * @author jinzhenhua
 * @version 1.0  ,create at:2019/11/27 9:02
 */
public abstract class BaseFragment extends Fragment {
    //双重判定,保证懒加载
    protected boolean isVisible;//这个,标记,当前Fragment是否可见,防止重复分发事件,如可见时还重复加载数据
    private boolean isViewCreate = false;//view
    //只有两个标记同时满足,才进行数据加载

    protected View view;


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(getLayoutId(),null);
        initView(view);
        isViewCreate = true;
        if(getUserVisibleHint()){
            dispatchVisibleHint(true);//加载默认第一个页面时,setUserVisibleHint会在onCreateView前执行,所以会不执行页面的加载
        }
        return view;
    }

    /**
     * 在viewPager中会调用该方法,来设置fragment是否可见
     * @param isVisibleToUser
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        //当VIEW已经初始化,才能分发事件
        if(isViewCreate){
            if(isVisibleToUser && !isVisible){//本来不可见时,才会分发加载事件
                dispatchVisibleHint(true);
            }else if(!isVisibleToUser && isVisible){
                dispatchVisibleHint(false);
            }
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if(!isVisible && getUserVisibleHint() && !isHidden()){
            dispatchVisibleHint(true);
        }
    }

    @Override
    public void onPause() {
        super.onPause();

        if(isVisible && getUserVisibleHint()){
            dispatchVisibleHint(false);//跳转Activity时或者回到桌面时需要停止加载
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

    protected abstract void initView(View view);

    protected abstract int getLayoutId();


    /**
     * 事件分发
     * @param visibleState
     */
    private void dispatchVisibleHint(boolean visibleState){
        if(isVisible == visibleState){///在跨table显示时会分发多次事件
            return;
        }

        isVisible = visibleState;
        if(visibleState){
            onFragmentLoad();
        }else{
            onFragmentLoadStop();
        }
    }

    /**
     * 加载数据
     */
    public void onFragmentLoad(){

    }

    /**
     * 停止加载
     */
    public void onFragmentLoadStop(){

    }
}

具体加载逻辑在 onFragmentLoad 以及 onFragmentLoadStop 方法中实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值