<microrock>

microrock

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  大家在使用手机新闻客户端的时候就会有一个发现,大多数的新闻客户端都会把新闻分类,诸如头条、娱乐、体育、科技等等,如何实现这种界面的呢?这个实现起来其实很简单,就是在一个Fragment中实现多个ViewPage的切换,再在ViewPage的上面放一个TabLayout,关联起来就可以实现联动效果。如果大家感觉不太明了的话,以后我可以专门写一篇关于Fragment中放入多个ViewPage的博客,今天,我主要介绍的是怎样实现界面即Fragment的懒加载。那么,大家就会奇怪了既然是加载界面直接加载就好了,为何还要使用懒加载呢?这就需要说一下懒加载的好处了。前文已经介绍过了,大多数新闻客户端实现各种新闻切换的原理是一个Fragment中存放多个ViewPage,如果进入程序之后将所有的ViewPage中的数据都加载上的话,那么无疑会增加APP运行时的负担,而懒加载则可以实现程序启动时fragment中的viewpage只预加载一个界面,等到滑到下一界面时再加载下一个viewpage的数据,并且实现加载界面缓存,下一次再切换到此界面时就不再重新加载了。好了,解释清楚为何要用懒加载,下面就进入今天的正题吧。

  第一步:自定义一个fragment让他继承Fragment

       1、重写setUserVisibleHint方法

    2、定义一个抽象方法lazyInitData()
 1 package com.jereh.jinritoutiao.fragmentdemo.fragment;
 2 
 3 import android.support.v4.app.Fragment;
 4 
 5 /**
 6  * Created by zhangdi on 2016/8/8.
 7  */
 8 public abstract class BaseFragment extends Fragment {
 9 protected boolean isVisible = false;
10 @Override
11 public void setUserVisibleHint(boolean isVisibleToUser) {
12 super.setUserVisibleHint(isVisibleToUser);
13 if (isVisibleToUser){
14 //加载数据
15 isVisible = true;
16             lazyInitData();
17         }else {
18 isVisible = false;
19         }
20     }
21 public abstract void lazyInitData();
22 }

  第二步:再定义一个fragment继承刚才定义的fragment

    1、先定义一个全局变量来保存fragment的状态(这一步是为缓存界面准备)定义两个boolean型的变量分别表明fragment的视图控件已经准      备好以及当前fragment是否已经加载过数据

     2、判断fragment的状态是不是为空,为空时再生成新界面

   3、重写父类的lazyInitData()方法实现懒加载
 1 /**
 2  * A simple {@link Fragment} subclass.
 3  */
 4 public class NetNewsFragment extends BaseFragment {
 5   //定义一个全局变量用来保存Fragment的状态
 6   private View v;
 7   //listview展示的数据
 8   private List<NetNews> mData;
 9   private PullToRefreshListView lv;
10   @Override
11   public void onCreate(Bundle savedInstanceState) {
12     super.onCreate(savedInstanceState);
13     String u= getArguments().getString("api");
14     if(!TextUtils.isEmpty(u)){
15       url = u;
16         }
17    }
18 
19   @Override
20   public View onCreateView(LayoutInflater inflater, ViewGroup container,
21                              Bundle savedInstanceState) {
23         if(v==null) {
24           //将布局关联起来
25           v = inflater.inflate(R.layout.fragment_net_news, container, false);
26           //找到ViewPage
27           lv = (PullToRefreshListView) v.findViewById(R.id.lv01);
28           mData = new ArrayList<>();
29           //初始化适配器
30           adapter = new NetNewsAdapter(mData, getActivity());
31           lv.setAdapter(adapter);
32           //界面已经准备完毕
33           isPrepared = true;
34               (new android.os.Handler()).postDelayed(new Runnable() {
35             @Override
36             public void run() {
37                     lazyInitData();
38                   }
39                 },200);
40              }
41         return v;
42      }
43 
44   /**
45      * 初始化Fragment数据的方法,实现懒加载
46    */
47   @Override
48   public void lazyInitData() {
49     if (isPrepared&&isVisible&&isFirst){
50         lv.setRefreshing();
51             VolleyUtil.get(url+"?num=20&page="+page)
52                 .setCallBack(new NetCallBack())
53                 .build()
54                 .addRequestHeader("apikey", Constants.API_KEY)
55                 .start();
56     isFirst = false;
57         }
58     }

  这里我为了将懒加载的代码凸显出来,所以PullToListView的样式监听我都省略了,而这里(new android.os.Handler()).postDelayed(new Runnable())中的方法是用多线程的方式实现了异步加载继而达到初始化布局时有时间生成界面组件然后再加载数据。

  至此,安卓中实现界面(Fragment)数据懒加载的目的就达到了。大家以后若是想要实现多张界面切换并且数据需要网络请求的话,建议多使用懒加载。好了,关于懒加载的介绍就说到这里,如果大家感觉笔者写的还不错的话就麻烦推荐一下,若是感觉笔者哪个地方介绍的不好或是知识点有什么不对的话希望评论指正,谢谢。

 

posted on 2016-09-06 22:31  microrock  阅读(2854)  评论(0编辑  收藏  举报