专栏首页andy的小窝BaseFragment 延迟加载lazyload

BaseFragment 延迟加载lazyload

 public abstract class BaseFragment extends Fragment{
    protected View mContentView;
    protected AppController mApp;
    /**
     * 视图是否已经初初始化
     */
    protected boolean isInit = false;
    protected boolean isLoad = false;
    protected final String TAG = "LazyLoadFragment";


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mApp=AppController.getInstance();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        isInit = false;
        isLoad = false;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 避免多次从xml中加载布局文件
        if (mContentView == null) {
            initView(savedInstanceState);
            setListener();
            processLogic(savedInstanceState);
            isInit = true;
            /**初始化的时候去加载数据**/
            isCanLoadData();
        } else {
            ViewGroup parent = (ViewGroup) mContentView.getParent();
            if (parent != null) {
                parent.removeView(mContentView);
            }
        }
        return mContentView;
    }



    /**
     * 视图是否已经对用户可见,系统的方法
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        isCanLoadData();
    }

    /**
     * 是否可以加载数据
     * 可以加载数据的条件:
     * 1.视图已经初始化
     * 2.视图对用户可见
     */
    private void isCanLoadData() {
        if (!isInit) {
            return;
        }

        if (getUserVisibleHint()) {
            lazyLoad();
            isLoad = true;
        } else {
            if (isLoad) {
                stopLoad();
            }
        }
    }

    protected void setContentView(@LayoutRes int layoutResID, Activity activity) {
        mContentView = LayoutInflater.from(activity).inflate(layoutResID, null);
    }

    protected void setContentView(@LayoutRes int layoutResID) {
        mContentView = LayoutInflater.from(mApp).inflate(layoutResID, null);
    }

    protected abstract void initView(Bundle savedInstanceState);

    protected abstract void setListener();

    protected abstract void processLogic(Bundle savedInstanceState);

    protected void ShowToast(String text){
        ToastUtil.show(text);
    }

    /**
     * 查找View
     *
     * @param id   控件的id
     * @param <VT> View类型
     * @return
     */
    protected <VT extends View> VT getViewById(@IdRes int id) {
        return (VT) mContentView.findViewById(id);
    }

    /**
     * 当视图初始化并且对用户可见的时候去真正的加载数据
     */
    protected abstract void lazyLoad();

    /**
     * 当视图已经对用户不可见并且加载过数据,如果需要在切换到其他页面时停止加载数据,可以覆写此方法
     */
    protected void stopLoad() {
    }

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

注意1:在某些时候setContentView(V)可能会引发null 异常就需要调用setContentView(V,T)

注意2:在延迟加载功能中需要添加 private boolean isLoad=false; 做一个状态判断

@Override
    protected void lazyLoad() {
        if (!isLoad) {
            isLoad = true;
        }
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android 更新实现

    1使用Rxjava2与retrofit2获取更新信息,调用loadUpdate()即可。

    用户4458175
  • 关于presenter一直持有Activity对象导致的内存泄漏问题

    用户4458175
  • Recyclerview返回顶部及分割线代码实现

    //imageview 就是返回顶部的图像 调用recyclerView.smoothScrollToPosition(0);

    用户4458175
  • 深入Golang调度器之GMP模型

    随着服务器硬件迭代升级,配置也越来越高。为充分利用服务器资源,并发编程也变的越来越重要。在开始之前,需要了解一下并发(concurrency)和并行(paral...

    sunsky
  • kube-scheduler predicates 与 priorities 调度算法源码分析

    在上篇文章kube-scheduler 源码分析中已经介绍了 kube-scheduler 的设计以及从源码角度分析了其执行流程,这篇文章会专注介绍调度过程中 ...

    田飞雨
  • 动静分离架构,究竟是啥?

    前两天简单介绍了“前台与后台分离”的架构设计准则,又有水友提问:能不能顺带介绍下“动静分离”的架构设计准则呢?今天花1分钟简单说说。

    架构师之路
  • 诡异的【session丢失】和【<img src="">标签】

         项目发布到服务器上面了,但是客户在使用的时候发现,只要进入新增页面和修改页面。再进行操作就会自动跳转到登陆页面(我设置了session保存用户登陆信息...

    菩提树下的杨过
  • 学计算机,还不知道数据编码?你OUT了

    Even if the road is bumpy, the wheels have to move forward; even the rivers roar...

    小Bob来啦
  • Go语言轻量级线程Goroutine用法实例

    本文实例讲述了Go语言轻量级线程Goroutine用法。分享给大家供大家参考。具体如下: goroutine 是由 Go 运行时环境管理的轻量级线程。 go f...

    李海彬
  • Go语言轻量级线程Goroutine用法实例

    本文实例讲述了Go语言轻量级线程Goroutine用法。分享给大家供大家参考。具体如下: goroutine 是由 Go 运行时环境管理的轻量级线程。 go f...

    李海彬

扫码关注云+社区

领取腾讯云代金券