viewpager+fragment 懒加载操作
2016-05-28 17:13
441 查看
项目当中使用到tablayout+viewpager+fragment组合, 也是现在app非常流行的一种设计.
viewpager切换页面时,让fragment进行懒加载操作,是比较好的体验,节省省流量,避免预加载时造成的卡顿现象.
懒加载操作主要使用到fragment 的 setUserVisibleHint() , 及getUserVisibleHint()方法
setUserVisibleHint() 方法在viewpageradapter内部调用, 会为fragment 进行赋值, 如果fragment 不可见赋值为false. 反之为true.
getUserVisibleHint() 方法是获取这个值, 通过fragment 当前是否可见, 来进行加载数据的操作, 这样就实现了预加载的功能.
viewpager切换页面时,让fragment进行懒加载操作,是比较好的体验,节省省流量,避免预加载时造成的卡顿现象.
懒加载操作主要使用到fragment 的 setUserVisibleHint() , 及getUserVisibleHint()方法
setUserVisibleHint() 方法在viewpageradapter内部调用, 会为fragment 进行赋值, 如果fragment 不可见赋值为false. 反之为true.
getUserVisibleHint() 方法是获取这个值, 通过fragment 当前是否可见, 来进行加载数据的操作, 这样就实现了预加载的功能.
package cn.cibn.haokan.ui.categoryList; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import cn.cibn.haokan.ui.base.ImgBaseFragment; public abstract class LazyFragment extends ImgBaseFragment{ /** * Fragment title */ public String fragmentTitle; /** * 是否可见状态 */ private boolean isVisible; /** * 标志位,View已经初始化完成。 * 2016/04/29 * 用isAdded()属性代替 * 2016/05/03 * isPrepared还是准一些,isAdded有可能出现onCreateView没走完但是isAdded了 */ private boolean isPrepared; /** * 是否第一次加载 */ private boolean isFirstLoad = true; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 若 viewpager 不设置 setOffscreenPageLimit 或设置数量不够 // 销毁的Fragment onCreateView 每次都会执行(但实体类没有从内存销毁) // 导致initData反复执行,所以这里注释掉 // isFirstLoad = true; // 2016/04/29 // 取消 isFirstLoad = true的注释 , 因为上述的initData本身就是应该执行的 // onCreateView执行 证明被移出过FragmentManager initData确实要执行. // 如果这里有数据累加的Bug 请在initViews方法里初始化您的数据 比如 list.clear(); isFirstLoad = true; View view = initViews(inflater, container, savedInstanceState); isPrepared = true; lazyLoad(); return view; } /** * 如果是与ViewPager一起使用,调用的是setUserVisibleHint * * @param isVisibleToUser 是否显示出来了 */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (getUserVisibleHint()) { isVisible = true; onVisible(); } else { isVisible = false; 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) { isVisible = true; onVisible(); } else { isVisible = false; onInvisible(); } } protected void onVisible() { lazyLoad(); } protected void onInvisible() { } /** * 要实现延迟加载Fragment内容,需要在 onCreateView * isPrepared = true; */ protected void lazyLoad() { if (isPrepared && isVisible && isFirstLoad) { isFirstLoad = false; initData(); } } protected abstract View initViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState); protected abstract void initData(); }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories