关键词:
大家在使用手机新闻客户端的时候就会有一个发现,大多数的新闻客户端都会把新闻分类,诸如头条、娱乐、体育、科技等等,如何实现这种界面的呢?这个实现起来其实很简单,就是在一个Fragment中实现多个ViewPage的切换,再在ViewPage的上面放一个TabLayout,关联起来就可以实现联动效果。如果大家感觉不太明了的话,以后我可以专门写一篇关于Fragment中放入多个ViewPage的博客,今天,我主要介绍的是怎样实现界面即Fragment的懒加载。那么,大家就会奇怪了既然是加载界面直接加载就好了,为何还要使用懒加载呢?这就需要说一下懒加载的好处了。前文已经介绍过了,大多数新闻客户端实现各种新闻切换的原理是一个Fragment中存放多个ViewPage,如果进入程序之后将所有的ViewPage中的数据都加载上的话,那么无疑会增加APP运行时的负担,而懒加载则可以实现程序启动时fragment中的viewpage只预加载一个界面,等到滑到下一界面时再加载下一个viewpage的数据,并且实现加载界面缓存,下一次再切换到此界面时就不再重新加载了。好了,解释清楚为何要用懒加载,下面就进入今天的正题吧。
第一步:自定义一个fragment让他继承Fragment
1、重写setUserVisibleHint方法
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的状态是不是为空,为空时再生成新界面
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)数据懒加载的目的就达到了。大家以后若是想要实现多张界面切换并且数据需要网络请求的话,建议多使用懒加载。好了,关于懒加载的介绍就说到这里,如果大家感觉笔者写的还不错的话就麻烦推荐一下,若是感觉笔者哪个地方介绍的不好或是知识点有什么不对的话希望评论指正,谢谢。
vue项目中实现图片懒加载的方法(代码片段)
对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载,等到滚动到可视区域后再去加载。这样子对于页面加载性能上会有很大的提升,也提高了用... 查看详情
vuevue-cli3构建项目中实现图片懒加载(代码片段)
前两天正好写了文章如何用实现图片懒加载【性能优化】JS实现图片懒加载,今天在使用vue构建项目的时候就遇到了要做图片懒加载的优化需要,本想把前两天的代码直接copy过来的,后来想查查看有没有更简便的方法,果不其然... 查看详情
关于fragment的懒加载问题
为了达到界面效果,我们有时需要使用到TabLayout+ViewPager的方式来布局界面,然而ViewPager的adapter总是默认把与当前可见的fragment相邻的两个fragment给加载出来.一旦界面数据太多,信息量太大,往往造成资源过多消耗,界面卡顿,甚至... 查看详情
ios之懒加载
今天很坑爹,做界面的时候,tableview明显做了复用了,数组也做了懒加载了,获取数据前也把数组给清空了,但是每次获取数据刷新表格的时候,数据确重复覆盖了(重复创建),后来给cell加了个白色的背景图片... 查看详情
在web中实现imgui界面(代码片段)
在Web中实现ImGui界面前言技术方案成果扩展前言想为自己的服务端增加一个性能/数据监控系统,使用web是一个最合理的选择。写过几天vue.js,做过一个简单的app,咋说呢,可能是我学习能力太差了吧,不是特... 查看详情
在web中实现imgui界面(代码片段)
在Web中实现ImGui界面前言技术方案成果扩展前言想为自己的服务端增加一个性能/数据监控系统,使用web是一个最合理的选择。写过几天vue.js,做过一个简单的app,咋说呢,可能是我学习能力太差了吧,不是特... 查看详情
如何在安卓开发中实现对listview的增删改查与刷新
要求:1初始状态listview包含0个item2点击增加按钮后,跳转到另一个界面进行录入2勾选item的checkbox后,所在item被删除参考技术A其实很简单,主要是对listview的数据源进行增删改查的操作之后刷新listview,调用adapter的方法notifydatesetch... 查看详情
qt内存数据大,懒加载向有滚动条的文本写入数据
参考技术A这样可以避免界面卡死m_everyRead为每次插入行数.h 查看详情
fragmentviewpager与fragment实现懒加载
...,废话不多说了,我也改讲一讲怎么实现懒加载,先看看界面是怎样的:暂时没有数据,不影响我们的效果,界面是一个订单的Activity,布局是上面一个自定义的TitileBar,下面是一 查看详情
如何在基于 SQLite 的 recyclerview 中实现 searchview? - 安卓
】如何在基于SQLite的recyclerview中实现searchview?-安卓【英文标题】:HowtoimplementsearchviewinrecyclerviewwhichbasedonSQLite?-Android【发布时间】:2021-11-0506:45:11【问题描述】:我正在构建Android应用程序,它将患者详细信息存储在SQLite数据库... 查看详情
在 EF Core 中实现递归属性加载
】在EFCore中实现递归属性加载【英文标题】:ImplementingrecursivepropertyloadinginEFCore【发布时间】:2016-12-0603:32:08【问题描述】:我使用的是.NETCore1.1.0、EFCore1.1.0、VS2015。我正在为帖子/cmets编写一个系统,我需要一个函数来加载评论... 查看详情
django中实现加载渲染模版(代码片段)
一、创建模版 二、代码实现fromdjango.shortcutsimportrenderfromdjango.templateimportloaderfromdjango.httpimportHttpResponse#Createyourviewshere.defapp_three(request):#加载获取模版index=loader.get_template(‘three.htm 查看详情
如何在 ASP.NET 页面中实现异步加载?
】如何在ASP.NET页面中实现异步加载?【英文标题】:HowtoimplementasynchronousloadinginASP.NETpage?【发布时间】:2012-02-0623:11:53【问题描述】:ASP.NET页面如何实现异步加载?我的ASP.NET页面中有3个部分。所有部分都是独立的。LoadSection1();... 查看详情
如何在 Next.js 中实现加载屏幕
】如何在Next.js中实现加载屏幕【英文标题】:HowtoimplementloadingscreeninNext.js【发布时间】:2020-07-2519:37:02【问题描述】:我是nextjs的新手,使用nextjsv9.3、next-redux-wrapperv5、@material-ui/corev4.2和customexpressserver。我试图在我的Nextjs应用... 查看详情
在A section tableview中实现加载更多
】在Asectiontableview中实现加载更多【英文标题】:ImplemantloadmoreinA-Zsectiontableview【发布时间】:2014-01-2104:07:21【问题描述】:我的项目中有一个表格视图,它有A-Z部分,内容根据名称字段加载到表格视图中,这意味着A然后Aa然后Aa... 查看详情
在主详细信息界面中实现类似“全部”过滤器的 iTunes
】在主详细信息界面中实现类似“全部”过滤器的iTunes【英文标题】:ImplementItuneslike"All"filterinmasterdetailinterface【发布时间】:2009-10-2504:43:11【问题描述】:在iTunes中,音乐浏览器中有一个“全部”过滤器。例如,用户可... 查看详情
Spring Boot:加载所有在测试中实现接口的bean?
】SpringBoot:加载所有在测试中实现接口的bean?【英文标题】:SpringBoot:loadallbeansimplementinganinterfaceintest?【发布时间】:2020-12-1920:22:51【问题描述】:我有一些接口Filter和这个接口的一些实现。在@Test中,我想加载所有实现Filter的... 查看详情
cad在openlayers中实现思路
CADDWG文件属于加密文件没有过多的去研究CADDXF文件属于文本型文件OPENLAYERS可以加载GEOJSON文件DXF--GEOJSON(文件过大时加载浏览器崩溃)-- 导入数据库--根据zoom级别抽稀压缩传输--浏览器端还原 GEOJSON DXF2GEOJSONimportosfromosg... 查看详情