本发明涉及一种Android系统中ListView快速分页加载的方法,属于安卓系统ListView列表优化技术领域。
背景技术:
近年来,Android操作系统不断发展演进,搭载Android操作系统的智能设备逐渐成为普通人每天必不可少的工具。在安卓设备与用户进行交互的各种方式中,以列表进行信息展示是最常用的一种,因此,ListView成为Android系统中应用最灵活广泛的控件之一。开发者可以通过ListView向用户展示资源,包括展示文字、图片、数据等多种不同类型的内容,例如常用的联系人列表、微博信息、微信消息等都是使用ListView控件来实现的。
通常情况下,ListView需要加载的资源往往都超出了Android设备屏幕一页所容纳的数量,当ListView预期要加载的内容包括很多个子项时,如果待加载的资源存在于数据库或服务器中,此时若直接加载全部信息,庞大的数据量会造成大量的内存和网络流量消耗,并且在客户端造成用户长时间等待,对终端用户产生不好的使用体验。基于此,需要对ListView的内容进行分页加载,只显示当前页面内的子项内容,当用户需要读取更多数据时上拉触发加载,再将新加载的数据添加到显示列表中进行显示。目前Android提供的分页操作大致是在Activity中通过滑动监听器的监听状态触发新的加载,更新固定数目的Item,数据变化后通过Adapter来通知ListView刷新数据,接收数据并进行显示。这种方法存在以下缺陷:1、当应用程序中多处都需要使用ListView列表控件时,需要针对每个控件写分页逻辑以达到预期效果,编程复杂导致软件臃肿,占用更大的存储资源,造成不好的用户体验。2、如果服务器端提供的分页策略发生变化,则在客户端软件需要进行大量的修改,不同策略的操作混在一起,代码复杂会导致效率低下,应用程序不易维护。
技术实现要素:
针对现有技术的不足,本发明提供了一种Android系统中ListView快速分页加载的方法。
本发明针对应用程序中加载服务器资源的不同方式,给出了ListView加载资源的相应方法,并且将不同方法进行比较概括,封装成为通用的抽象父类,并在继承子类中获取不同加载模式所需的不同参数,则在Activity中使用ListView时可简单地通过实例化相应子类对象来实现ListView的快速分页加载。本发明公开的方法既通过分页加载实现了迅速的响应和较小的资源开销,又通过封装实现了分页方法的抽象和快速移植利用,满足了固定分页加载和自任一项加载多种不同的需求,使ListView的使用更清晰明确,同时易扩展、易维护,提高了系统效率。
术语解释:
1、ListView,指Android系统中的列表控件。
2、继承,指Java中子类继承父类,可以获得父类的属性和方法。
3、回调函数,指被调用类反过来使用了调用类中的方法,该方法即为回调函数。
4、divideBase类,是指本发明中实现分页逻辑的抽象父类。
5、固定分页加载,是指服务器端资源按页进行存储和加载的方式。
6、从任一项起始加载,是指服务器端的每条数据分别进行存储和加载的方式。
本发明的技术方案为:
一种Android系统中ListView快速分页加载的方法,包括步骤如下:
(1)初始化起始状态;
(2)获取加载数据所需的参数,该参数用以确定所加载数据的位置,根据分页加载模式的不同,封装成不同的独立的抽象方法,即参数获取方法,供不同的子类实现;
(3)封装加载数据抽象方法,在本方法中需要调用步骤(2)中的参数获取方法,将加载数据所需的参数传递到本步骤的方法中;
(4)实现具体的数据加载方法,即对步骤(3)中封装的加载数据抽象方法进行具体使用:先判断加载标志位状态,如果加载标志位状态为false状态时,则判定当前没有加载任务,调用步骤(3)中的加载数据抽象方法,同时将加载标志位置为true状态;否则,当加载标志位状态为true状态时,则判定当前有加载任务,不执行加载方法,也不返回任何数据;加载标志位是一个boolean类型的量,包括true状态和false状态两种状态,false状态表示当前没有加载线程执行,true状态表示当前已有加载线程正在运行;
(5)当加载结束时,判断是否成功加载新数据,如果成功,ListView的适配器会收到新数据,更新当前显示界面页标号参数,就是赋新值,更新为返回来的当前参数值,并返回本次加载所读取的新数据,并在客户端进行显示,同时将加载标志位置为false;如果加载失败,返回原来的页标号状态,即返回原状态。不影响下一次的加载请求。
根据本发明优选的,上述步骤(3)至步骤(5)由抽象父类即divideBase类来实现。由此完成了客户端请求服务器端加载资源的通用逻辑封装。
根据本发明优选的,所述步骤(2),当分页加载模式为按固定分页加载时,参数获取方法由子类divideA实现,设定需要获取的两个参数分别记为param1、param2,包括步骤如下:
A、在服务器端提供的资源池中,为全部资源进行分页标号;
B、客户端向服务器提出加载数据的请求时,同时向服务器发送当前客户端内容的页标号index,服务器根据收到的页标号index,将页标号index加1,即得到所需参数param1为index+1;每页所包含的数据子项数目size即为param2,服务器端根据参数按约定协议返回下一页的数据,如JSON格式,客户端通过回调函数获取下一页的数据后解析并显示在界面中。
根据本发明优选的,所述步骤(2),当分页加载模式为从任一项起始加载时,参数获取方法由子类divideB实现,设定需要获取的两个参数分别记为param3、param4,包括步骤如下:
C、在服务器端提供的资源池中,服务器端为显示在ListView中的每一项内容分别进行标号;
D、客户端向服务器提出加载数据的请求时,同时向服务器发送当前客户端界面中的首项位置position,即得到所需参数param3为position+size1,得到所需参数param4为param3+size1-1,size1为每页所包含的数据子项数目,服务器端根据参数按约定协议返回下一页的数据,如JSON格式,客户端通过回调函数获取下一页的数据后解析并显示在界面中。
上述参数param1、param2、param3、param4的计算方法由子类复写实现,父类中只提供抽象方法以供继承。
当应用程序的Activity中要使用ListView控件并进行分页加载时,只需要根据加载模式的不同实例化相应继承子类的对象,复写其加载方法并添加回调函数,完成加载过程,即可实现快速分页加载的操作。如果要使用其他加载模式,只需要实例化其他子类的对象即可,不必再重写相同的分页逻辑代码。
本发明的有益效果为:
1、本发明将ListView分页加载的过程拆分为实现基本通用分页逻辑的抽象父类、针对不同加载模式获取加载参数的继承子类、对ListView分页加载具体使用的Activity类三大部分,通过这种方法实现了ListView对资源的分页加载,降低用户等待时间的同时节省了资源消耗。
2、本发明通过封装实现了ListView分页加载功能的快速移植,当应用程序中需要使用该功能时,仅需实例化对象和简单的操作即可,无需多处重复添加分页逻辑,大大简化了代码复杂程度,提升了开发速度,使ListView的使用更清晰明确,同时易扩展、易维护,提升了系统性能。
附图说明
图1为Android系统中ListView快速分页加载的方法的流程框图;
图2为按固定分页加载对应的继承子类divideA类框架图;
图3为从任一项起始加载对应的继承子类divideB类框架图;
图4为使用ListView快速分页功能的Activity框架图。
具体实施方式
下面结合说明书附图和实施例对本发明作进一步限定,但不限于此。
实施例
一种Android系统中ListView快速分页加载的方法,如图1所示,包括步骤如下:
(1)初始化起始状态;
(2)获取加载数据所需的参数,该参数用以确定所加载数据的位置,根据分页加载模式的不同,封装成不同的独立的抽象方法,即参数获取方法,供不同的子类实现;
当分页加载模式为按固定分页加载时,参数获取方法由子类divideA实现,设定需要获取的两个参数分别记为param1、param2,如图2所示,包括步骤如下:
A、在服务器端提供的资源池中,为全部资源进行分页标号;
B、客户端向服务器提出加载数据的请求时,同时向服务器发送当前客户端内容的页标号index,服务器根据收到的页标号index,将页标号index加1,即得到所需参数param1为index+1;每页所包含的数据子项数目size即为param2,服务器端根据参数按约定协议返回下一页的数据,如JSON格式,客户端通过回调函数获取下一页的数据后解析并显示在界面中。
当分页加载模式为从任一项起始加载时,参数获取方法由子类divideB实现,设定需要获取的两个参数分别记为param3、param4,如图3所示,包括步骤如下:
C、在服务器端提供的资源池中,服务器端为显示在ListView中的每一项内容分别进行标号;
D、客户端向服务器提出加载数据的请求时,同时向服务器发送当前客户端界面中的首项位置position,即得到所需参数param3为position+size1,得到所需参数param4为param3+size1-1,size1为每页所包含的数据子项数目,服务器端根据参数按约定协议返回下一页的数据,如JSON格式,客户端通过回调函数获取下一页的数据后解析并显示在界面中。
(3)封装加载数据抽象方法,在本方法中需要调用步骤(2)中的参数获取方法,将加载数据所需的参数传递到本步骤的方法中;
(4)实现具体的数据加载方法,即对步骤(3)中封装的加载数据抽象方法进行具体使用:先判断加载标志位状态,如果加载标志位状态为false状态时,则判定当前没有加载任务,调用步骤(3)中的加载数据抽象方法,同时将加载标志位置为true状态;否则,当加载标志位状态为true状态时,则判定当前有加载任务,不执行加载方法,也不返回任何数据;加载标志位是一个boolean类型的量,包括true状态和false状态两种状态,false状态表示当前没有加载线程执行,true状态表示当前已有加载线程正在运行;
(5)当加载结束时,判断是否成功加载新数据,如果成功,ListView的适配器会收到新数据,更新当前显示界面页标号参数,就是赋新值,更新为返回来的当前参数值,并返回本次加载所读取的新数据,并在客户端进行显示,同时将加载标志位置为false;如果加载失败,返回原来的页标号状态,即返回原状态。不影响下一次的加载请求。
上述步骤(3)至步骤(5)由抽象父类即divideBase类来实现。由此完成了客户端请求服务器端加载资源的通用逻辑封装。
上述参数param1、param2、param3、param4的计算方法由子类复写实现,父类中只提供抽象方法以供继承。
当应用程序的Activity中要使用ListView控件并进行分页加载时,只需要根据加载模式的不同实例化相应继承子类的对象,复写其加载方法并添加回调函数,完成加载过程,即可实现快速分页加载的操作。如果要使用其他加载模式,只需要实例化其他子类的对象即可,不必再重写相同的分页逻辑代码。如图4所示。