【Android】实战开发之ViewPager+Fragment预加载问题完美解决
Android实战开发中,当我们使用ViewPager+Fragment的时候肯定知道Fragment会预先加载两侧Fragment的布局,如果有大量数据的话,会造成Fragment卡顿现象,所以这里说明一种Fragment缓加载的方式,相当简单,只要继承以下父类Fragment,再在对应方法中加载数据即可实现Fragment缓加载了,剩下的注释很清楚,如果你还想在缓加载基础上实现下拉刷新等功能,那就更好了。
一、父类BaseFragment
import android.support.v4.app.Fragment;
/**
* 基础Fragment,子类Fragment都继承自它,尤其是ViewPager中的Fragment
* 因为ViewPager+Fragment组合使用时会产生预先加载前后Fragment,若再加上比较大的数据量,就会造成卡顿的现象,
* 为防止发生,可以在用户可见的时候加载数据,因此才会写一个BaseFragment
* @author tongleer.com
*
*/
public class BaseFragment extends Fragment{
/**
* 当前界面是否呈现给用户的状态标志
*/
protected boolean isVisible;
/**
* 重写Fragment父类生命周期方法,在onCreate之前调用该方法,实现Fragment数据的缓加载.
* @param isVisibleToUser 当前是否已将界面显示给用户的状态
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
/**
* 当界面呈现给用户,即设置可见时执行,进行加载数据的方法
* 在用户可见时加载数据,而不在用户不可见的时候加载数据,是为了防止控件对象出现空指针异常
*/
protected void onVisible(){
setlazyLoad();
}
/**
* 当界面还没呈现给用户,即设置不可见时执行
*/
protected void onInvisible(){
}
/**
* 加载数据方法
*/
protected void setlazyLoad(){
}
}
二、子类DemoPreloadFragment
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* 预加载Fragment例子
* @author tongleer.com
*
*/
public class DemoPreloadFragment extends BaseFragment{
/**
* 预加载标志,默认值为false,设置为true,表示已经预加载完成,可以加载数据
*/
private boolean isPrepared;
/**
* Fragment生命周期方法,此view可改为自定义的布局
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(android.R.layout.activity_list_item, container, false);
//TODO 此处初始化view中各个控件
isPrepared = true;
setlazyLoad();
return view;
}
/**
* 加载数据的方法,只要保证isPrepared和isVisible都为true的时候才往下执行开始加载数据
*/
@Override
protected void setlazyLoad() {
super.setlazyLoad();
if(!isPrepared || !isVisible) {
return;
}
//TODO 此处填充view中各个控件的数据
}
}
over.