viewpager+fragment 懒加载操作
来源:互联网 发布:bjd娃娃6分娃淘宝 编辑:程序博客网 时间:2024/05/20 07:33
项目当中使用到tablayout+viewpager+fragment组合, 也是现在app非常流行的一种设计.
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();}
2 0
- viewpager+fragment 懒加载操作
- ViewPager+Fragment懒加载
- Viewpager Fragment懒加载
- ViewPager+Fragment懒加载
- ViewPager+Fragment懒加载
- viewPager fragment 懒加载
- fragment viewpager 懒加载
- ViewPager加载Fragment懒加载
- viewpager+fragment的懒加载
- ViewPager实现Fragment懒加载
- ViewPager+Fragment懒加载方式
- viewpager嵌套Fragment懒加载
- viewpager fragment 实现懒加载
- Android ViewPager + Fragment懒加载
- ViewPager + Fragment实现懒加载
- ViewPager+Fragment实现懒加载
- ViewPager+Fragment实现懒加载
- viewpager+fragment之fragment懒加载
- leetcode 24 Swap Nodes in Pairs C++
- 顺序表应用5:有序顺序表归并
- 【转载】springMVC表单校验+全注解
- 深入理解Java:SimpleDateFormat安全的时间格式化(多线程应用)
- Java 反射
- viewpager+fragment 懒加载操作
- poj 2387
- 安卓传感器入门(1)
- 获取颜色值
- [从头学数学] 第228节 函数与极限
- Python3 爬虫(二) -- 伪装浏览器
- mysql中index的如何使用,判断什么时候加索引(强烈推荐)
- HTML5与CSS3学习笔记(二)
- 无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。