博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓中实现界面数据懒加载
阅读量:6546 次
发布时间:2019-06-24

本文共 3561 字,大约阅读时间需要 11 分钟。

  大家在使用手机新闻客户端的时候就会有一个发现,大多数的新闻客户端都会把新闻分类,诸如头条、娱乐、体育、科技等等,如何实现这种界面的呢?这个实现起来其实很简单,就是在一个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 @Override11 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
mData; 9   private PullToRefreshListView lv;10   @Override11   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   @Override20   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           //找到ViewPage27           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             @Override36             public void run() {37 lazyInitData();38   }39     },200);40      }41         return v;42 }43 44   /**45 * 初始化Fragment数据的方法,实现懒加载46    */47   @Override48   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 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/zhangdiIT/p/5847445.html

你可能感兴趣的文章
spring的注解方式执行定时任务
查看>>
Html常用知识
查看>>
ubuntu MySQL 5.5 deb 安装
查看>>
Linux 实用快捷键整理 (持续更新)
查看>>
我的友情链接
查看>>
职业发展,选择大都市还是回老家?
查看>>
升级Oracle 10..2.0.1到Oracle 10.2.0.5
查看>>
linux进程和计划任务
查看>>
好程序员大数据教程Hadoop全分布安装(非HA)
查看>>
在人工智能风口下,AI翻译也火了
查看>>
小程序如何引流?我有一些小技巧!
查看>>
Oracle 重做日志恢复
查看>>
Oracle RAC 服务器端连接负载均衡
查看>>
Redis安装与主从配置
查看>>
第七章:选择器引擎
查看>>
CentOS 7 安装MySQL 5.7.15/MySQLl 5.7.17
查看>>
linux学习一天一个命令(13)[head命令]
查看>>
mysql 数据的批量导入
查看>>
萌新的Linux学习之路(三)
查看>>
This Android SDK requires Android Developer Toolkit version 20.0.0 or above
查看>>