大家在使用手机新闻客户端的时候就会有一个发现,大多数的新闻客户端都会把新闻分类,诸如头条、娱乐、体育、科技等等,如何实现这种界面的呢?这个实现起来其实很简单,就是在一个Fragment中实现多个ViewPage的切换,再在ViewPage的上面放一个TabLayout,关联起来就可以实现联动效果。如果大家感觉不太明了的话,以后我可以专门写一篇关于Fragment中放入多个ViewPage的博客,今天,我主要介绍的是怎样实现界面即Fragment的懒加载。那么,大家就会奇怪了既然是加载界面直接加载就好了,为何还要使用懒加载呢?这就需要说一下懒加载的好处了。前文已经介绍过了,大多数新闻客户端实现各种新闻切换的原理是一个Fragment中存放多个ViewPage,如果进入程序之后将所有的ViewPage中的数据都加载上的话,那么无疑会增加APP运行时的负担,而懒加载则可以实现程序启动时fragment中的viewpage只预加载一个界面,等到滑到下一界面时再加载下一个viewpage的数据,并且实现加载界面缓存,下一次再切换到此界面时就不再重新加载了。好了,解释清楚为何要用懒加载,下面就进入今天的正题吧。
第一步:自定义一个fragment让他继承Fragment
1、重写setUserVisibleHint方法
2、定义一个抽象方法lazyInitData()
package com.jereh.jinritoutiao.fragmentdemo.fragment;
import android.support.v4.app.Fragment;
public abstract class BaseFragment extends Fragment {
protected boolean isVisible = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser){
//加载数据
isVisible = true;
lazyInitData();
}else {
isVisible = false;
}
}
public abstract void lazyInitData();
}
第二步:再定义一个fragment继承刚才定义的fragment
1、先定义一个全局变量来保存fragment的状态(这一步是为缓存界面准备)定义两个boolean型的变量分别表明fragment的视图控件已经准备好以及当前fragment是否已经加载过数据
2、判断fragment的状态是不是为空,为空时再生成新界面
3、重写父类的lazyInitData()方法实现懒加载
public class NetNewsFragment extends BaseFragment {
//定义一个全局变量用来保存Fragment的状态
private View v;
//listview展示的数据
private List<NetNews> mData;
private PullToRefreshListView lv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String u= getArguments().getString("api");
if(!TextUtils.isEmpty(u)){
url = u;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(v==null) {
//将布局关联起来
v = inflater.inflate(R.layout.fragment_net_news, container, false);
//找到ViewPage
lv = (PullToRefreshListView) v.findViewById(R.id.lv01);
mData = new ArrayList<>();
//初始化适配器
adapter = new NetNewsAdapter(mData, getActivity());
lv.setAdapter(adapter);
//界面已经准备完毕
isPrepared = true;
(new android.os.Handler()).postDelayed(new Runnable() {
@Override
public void run() {
lazyInitData();
}
},200);
}
return v;
}
@Override
public void lazyInitData() {
if (isPrepared&&isVisible&&isFirst){
lv.setRefreshing();
VolleyUtil.get(url+"?num=20&page="+page)
.setCallBack(new NetCallBack())
.build()
.addRequestHeader("apikey", Constants.API_KEY)
.start();
isFirst = false;
}
}
这里我为了将懒加载的代码凸显出来,所以PullToListView的样式监听我都省略了,而这里(new android.os.Handler()).postDelayed(new Runnable())中的方法是用多线程的方式实现了异步加载继而达到初始化布局时有时间生成界面组件然后再加载数据。
至此,安卓中实现界面(Fragment)数据懒加载的目的就达到了。大家以后若是想要实现多张界面切换并且数据需要网络请求的话,建议多使用懒加载。
好了,关于懒加载的介绍就说到这里。
您可能感兴趣的文章:详解jQuery lazyload 懒加载Angular懒加载机制刷新后无法回退的快速解决方法jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)解析iOS应用的UI开发中懒加载和xib的简单使用方法基于javascript实现图片懒加载基于jquery的图片懒加载jsjQuery自适应轮播图插件Swiper用法示例jQuery简单实现iframe的高度根据页面内容自适应的方法使用jQuery和Bootstrap实现多层、自适应模态窗口懒加载实现的分页&&网站footer自适应