ListView数据一般会采用分页加载,以便提高用户体验。分页加载,那就涉及到滑动到底加载更多,逻辑是:监听ListView的滑动状态,判断若最后一条出现在屏幕中,则认为滑动到底,提交一个网络请求获取数据。在提交请求时,参数一般为起始下标fromIndex,终止下标toIndex。例如每次请求20条数据,加载第一页,提交的参数分别是fromIndex=0,toIndex=19,加载第二页,fromIndex=20,toIndex=39,以此类推。如果是这样的话,那就会有问题,场景如下:
当加载第一页数据时,提交参数为fromIndex=0,toIndex=19,服务器返回了20条数据,是第0-19条,
当加载第二页数据时,提交参数为fromIndex=20,toIndex=39,因为数据库一共也只有25条数据,那么这次服务器返回了5条数据,是第20-24条。
这时数据库数据突然增多,增加到了60条(即第0-59条),那么当加载第三页数据时,提交参数为fromIndex=40,toIndex=59,那么这次服务器返回了20条数据,是第40-59条。
大家看出问题来了吗,第25-39条数据是不是就请求不到了,出现这种问题主要是因为默认返回的数据都是20条,没有考虑不满20的情况。
解决此问题,有以下方法:
1.客户端请求的参数仍然是fromIndex,toIndex,不过fromIndex与toIndex的值要根据服务器真正返回的条数做计算,默认第一页是fromIndex0,toIndex=19,服务器返回了20条,第二页,fromIndex=20,toIndex=39,服务器返回了5条,那么第三次fromIndex=25,toIndex=44,以此类推。
2.客户端请求的参数是lastItemId,将上一页最后一条item id值作为参数提交给服务器,服务器将此id后一页的20条数据返回给客户端。
前者是客户端做的事情较多,后者是服务器做的事情较多。