最近需要实现一个下拉刷新上拉加载更多的项目,目前已经实现,下面总结下实现过程中遇到的问题和相关解决;
首先理清思路:因为涉及到网络获取数据以及数据的缓存,所以看似简单的一个实现,加上这些后就变得稍微复杂点了,那就一步一步由浅入深的理解;
我将整体结构分成三个部分完成:
1.进入首页,先获取数据填充当前ListView(判断获取方式,需要缓存)
2.下拉刷新,获取最新数据(无需缓存,直接联网获取)
3.上拉加载更多,获取更多数据( 判断获取方式,需要缓存)
整体设计中我使用了两个时间标志位lastRefreshTime和LastLoadMoreTime,根据这两个标志位的值进行数据筛选加载,例如下拉刷新的时候,获取最新数据的判断条件就是其createdAtTime>lastRefreshTime
在获取到数据后,将数据第一项的createdAtTime赋值为lastRefreshTime,以此达到标志位的作用
下面开始详细理解:
第一部分 进入首页,获取数据填充当前ListView
在获取数据之前,有个很重要的事情需要做:创建sharedPerferenced对象,用于存储lastRefreshTime和lastLoadMoreTime。
按照从数据库中加载数据的步骤,通过传给adapter一个数据集就能达到目的,但是这里存在通过网络获取数据的方法,所以就需要先进行判断,数据填充步骤如下:(默认数据排序按照createdAtTime降序排列)
1. 进入首页,查询数据库中是否存在数据
2. 如果数据库中存在数据,则给adapter适配数据库中的数据(取出数据中createdAtTime值最小的项,将其createdAtTime赋值给lastLoadMoreTime)
3. 如果数据库中没有数据,新建线程联网加载数据,加载完成后传递给adapter进行适配(取出数据中createdAtTime值最小的项,将其createdAtTime赋值给lastLoadMoreTime,将当前系统时间复制给lastRefreshTime)
以上,进入首页填充数据就完成了;
第二部分 下拉刷新,从网络获取最新数据
联网获取数据,关键点就是查询条件,我这里的查询条件是通过筛选数据的创建时间,数据结构中存在一个字段 createdAtTime,表示数据的创建时间,下面是详细步骤:
1. 用户进行下拉操作,新建线程联网进行查询操作,查询条件是createdAtTime>lastRefreshTime,按照createdAtTime降序排列
2. 如果查询返回结果为空,则表示没有更新,如果不为空,将数据传递给ListView进行数据更新,刷新操作完成
3. 将获取到的数据异步存入数据库中
以上,刷新操作完成,这个操作相对简单些,不用考虑缓存的事,直接从网络获取,然后展示并存入数据库中
第三部分 上拉加载更多,需要判断缓存有无
上拉加载更多的时候需要先判断数据库中是否存在比lastLoadMoreTime更早时候的数据,如果有就先获取缓存数据,没有则联网查询,以下是详细步骤:
1. 用户进行上拉操作,调用查询数据库的方法,查询条件是createdAtTime < lastLoadMoreTime按照createdAtTime降序排列,如果有查询结果,说明存在更多缓存,反之说明没有缓存,需要从网络加载;
2. 如果从数据库中查询到有结果,将结果传给adapter,并将数据集合中最后一项的createdAtTime值赋值给lastLoadMoreTime,这样来更新标志位
3. 如果从数据库中没有查询到结果,就新建线程联网查询,查询条件同样是createdAtTime < lastLoadMoreTime,按照createdAtTime降序排列,如果有返回结果,就将结果传给adapter展示,并将获取到的数据存入数据库,然后将数据集合中最后一项的createdAtTime值赋值给lastLoadMoreTime,这样来更新标志位,如果没有返回结果,就说明服务器上也没有更多数据了,提示用户“没有更多数据了”
整理以上三个步骤,会发现其实思路很简单,也就是借助两个时间标志位来进行条件筛选的,然后在获取数据的时候再判断有没有缓存,有则使用缓存,没有则联网获取
因为代码太长,且存在很多冗余和细节问题,这里就不贴出代码来了,毕竟第一次完成,这里将思路总结出来,个人觉得这不算是最好的思路,但是目前只能想到这种思路,待以后学习到新的方法,新的思路,再重新总结这个思路。