zoukankan      html  css  js  c++  java
  • 安卓中实现界面数据懒加载

      大家在使用手机新闻客户端的时候就会有一个发现,大多数的新闻客户端都会把新闻分类,诸如头条、娱乐、体育、科技等等,如何实现这种界面的呢?这个实现起来其实很简单,就是在一个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)数据懒加载的目的就达到了。大家以后若是想要实现多张界面切换并且数据需要网络请求的话,建议多使用懒加载。好了,关于懒加载的介绍就说到这里,如果大家感觉笔者写的还不错的话就麻烦推荐一下,若是感觉笔者哪个地方介绍的不好或是知识点有什么不对的话希望评论指正,谢谢。

  • 相关阅读:
    遍历Map集合:java.util.Map.Entry、KeySet两种方式
    Tomcat学习笔记(二)—— 一个简单的Servlet容器
    Tomcat学习笔记(一)一个简单的Web服务器
    对检查性异常和非检查性异常的理解
    org.apache.commons.beanutils.BeanMap简单使用例子
    (转)Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨
    试简述湿式报警阀调试时应满足的要求
    消防水系泵验收时应满足哪些要求
    消防水泵接合器的检查方法和技术要求如下: (1)查看水泵接合器的外观是否有瑕疵,油漆是否完整,形状尺寸和安装尺寸与提供的安装图纸是否相符; (2)对照设计文件查看选择的水泵接合器的型号、名称是否准确、一致; (3)水泵接合器的设置条件是否具备,其设置位置是否是在室外便于消防车接近和使用的地点; (4)检查水泵接合器的外形与室外消火栓是否雷同,以免混淆而延误灭火; (5)检查消防供水设施 官网及阀门
    消防给水和消火栓系统(一)
  • 原文地址:https://www.cnblogs.com/zhangdiIT/p/5847445.html
Copyright © 2011-2022 走看看