您的位置:首页 > 移动开发 > Android开发

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 当前是否可见, 来进行加载数据的操作, 这样就实现了预加载的功能.

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android