Fragment懒加载实现,BaseFragment封装

简介: Fragment懒加载实现,BaseFragment封装

抓住人生中的一分一秒,胜过虚度中的一月一年!

前言

在实际开发中,fragment使用经常会结合viewpager一起使用,页面可能会由三个或更多Fragment构成,每个fragment可能都是由复杂的布局结构所组成,这个时候直接加载出来,或是默认加载两三个都是有点耗费资源的,可能还会比较卡顿,所以懒加载这一名词就会提上议程

对于懒加载,通俗点讲就是看不见的不需要的不加载,当需要时再进行加载,让体验(页面绘制),流量等更节省

思路(其实很简单,思路明确了很好理解)

fragment中有一个setUserVisibleHint函数,此函数含义为 “当fragment被用户可见时,setUserVisibleHint()会调用且传入true值,当fragment不被用户可见时,setUserVisibleHint()则得到false值。”

了解了这个函数之后,稍微封装一下不就实现了懒加载了吗?

实现目标

1、布局初始化后,才能加载数据

2、界面是否可见后,才能加载数据

3、是否加载过数据,如果加载过,就不重复加载

4、定义个常量,可以强制性加载数据,可以手动控制(不过没啥用)

实现步骤

1、布局初始化后进行加载数据

/**
     * 是否初始化过布局
     */
    protected boolean isViewInitiated;
  @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        isViewInitiated=true;
        //加载数据方法
        prepareFetchData();
    }

2、界面可见了加载数据

/**
     * 当前界面是否可见
     */
    protected boolean isVisibleToUser;
@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        this.isVisibleToUser = isVisibleToUser;
        if (isVisibleToUser) {
            prepareFetchData();
        }
    }

3、定义个常量,可以强制性加载数据,可以手动控制(不过没啥用)

public void prepareFetchData() {
        prepareFetchData(false);
    }

4、加载过数据,就不重复加载

/**
     * 是否加载过数据
     */
 protected boolean isDataInitiated;
 public void prepareFetchData(boolean forceUpdate) {
        if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
            loadData();
            isDataInitiated = true;//不再重复加载
        }
    }

5、加载数据

/**
     * 判断懒加载条件
     *
     * @param forceUpdate 强制更新,没啥用
     */
    public void prepareFetchData(boolean forceUpdate) {
        if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
            loadData();
            isDataInitiated = true;
        }
    }
  /**
     * 懒加载
     */
    protected abstract void loadData();

下面介绍下子类Fragment如何使用

public class TextFragment extends BaseFragment{
    @Override
    protected BasePresenter createPresenter() {
        return null;
    }
    @Override
    protected int getLayoutId() {
        return R.layout.fragment_base;
    }
    @Override
    protected void initData() {
    }
    @Override
    protected void loadData() {
        //加载数据
    }
}

全部BaseFragment代码如下

/**
 * File descripition:
 *
 * @author lp
 * @date 2019/3/15
 */
public abstract class BaseFragment extends Fragment {
    public View view;
    public Activity mContext;
    /**
     * 是否初始化过布局
     */
    protected boolean isViewInitiated;
    /**
     * 当前界面是否可见
     */
    protected boolean isVisibleToUser;
    /**
     * 是否加载过数据
     */
    protected boolean isDataInitiated;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(getLayoutId(), container, false);
        ButterKnife.bind(this, view);
        mContext = getActivity();
        this.initData();
        return view;
    }
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        isViewInitiated=true;
        //加载数据
        prepareFetchData();
    }
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        this.isVisibleToUser = isVisibleToUser;
        if (isVisibleToUser) {
            prepareFetchData();
        }
    }
    public void prepareFetchData() {
        prepareFetchData(false);
    }
    /**
     * 判断懒加载条件
     *
     * @param forceUpdate 强制更新,好像没什么用?
     */
    public void prepareFetchData(boolean forceUpdate) {
        if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
            loadData();
            isDataInitiated = true;
        }
    }
    /**
     * 懒加载
     */
    protected abstract void loadData();
    /**
     * 获取布局ID
     *
     * @return
     */
    protected abstract int getLayoutId();
    /**
     * 数据初始化操作
     */
    protected abstract void initData();
    @Override
    public void onDestroy() {
        super.onDestroy();
        this.view = null;
    }
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.bind(getActivity()).unbind();
    }
    /**
     * [页面跳转]
     *
     * @param clz
     */
    public void startActivity(Class<?> clz) {
        startActivity(clz, null);
    }
    /**
     * [携带数据的页面跳转]
     *
     * @param clz
     * @param bundle
     */
    public void startActivity(Class<?> clz, Bundle bundle) {
        Intent intent = new Intent();
        intent.setClass(getActivity(), clz);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivity(intent);
    }
    /**
     * [含有Bundle通过Class打开编辑界面]
     *
     * @param cls
     * @param bundle
     * @param requestCode
     */
    public void startActivityForResult(Class<?> cls, Bundle bundle,
                                       int requestCode) {
        Intent intent = new Intent();
        intent.setClass(getActivity(), cls);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivityForResult(intent, requestCode);
    }
}

最后,祝大家创作愉快

相关文章
|
人工智能 IDE 开发工具
Studio Bot - 让 AI 帮我写 Android 代码
Studio Bot - 让 AI 帮我写 Android 代码
1848 1
|
XML Android开发 数据格式
Android MaterialButton使用详解,告别shape、selector
Android MaterialButton使用详解,告别shape、selector
789 0
Android MaterialButton使用详解,告别shape、selector
|
XML JavaScript 前端开发
鸿蒙开发(17)---WebView组件
鸿蒙开发(17)---WebView组件
2228 0
鸿蒙开发(17)---WebView组件
|
缓存 Android开发 iOS开发
Kotlin跨平台Compose Multiplatform实战指南
Kotlin Multiplatform (KMP) 结合 Compose Multiplatform,助力开发者用一套代码构建跨平台应用(Android、iOS、桌面和 Web)。本文提供实战指南,涵盖环境搭建、项目结构、共享 UI 编写、平台适配、状态管理及资源处理等内容。通过 expect/actual 处理差异,借助官方文档与示例项目学习,减少重复代码,优化多平台开发体验。
3385 18
|
测试技术
哪里不对改哪里!全能图像编辑模型Qwen-Image-Edit来啦
Qwen-Image-Edit基于20B Qwen-Image模型,融合视觉语义与外观控制,支持中英文文字精准编辑、风格迁移、IP创作等多重功能,具备SOTA性能,助力低门槛、高精度图像编辑。
4777 23
|
Dart 开发工具 Android开发
如何验证Flutter环境配置是否成功?
如何验证Flutter环境配置是否成功?
1854 164
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
Rust 前端开发 算法
java中如何实现单链表反转
本文介绍了单向链表的创建及其反转的三种实现方法。首先,通过`DataNode`类构建了一个包含10个节点的单向链表,并提供了链表的打印功能。接着,分别使用递归、遍历和借助栈的方式实现了链表反转。递归方法简单但受限于栈深度(最大约12000个节点),遍历方法通用且效率最高,而借助栈的方法虽然易于理解但效率较低。通过对不同方法的时间性能测试,得出遍历方式在处理大规模数据时表现最佳。
848 1
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
1625 9
|
SQL 关系型数据库 数据挖掘
Hive数据仓库基础知识
Hive数据仓库基础知识
853 1

热门文章

最新文章