Android ListView 实现异步 分页 加载导致的数据问题
AndroidListView翻页是初学者都会碰到的问题,但是现在要实现它的方法和实例网上已经很多很多了,但是本菜鸟一直被一个问题所困扰。是什么问题呢?咋们先来说说网页上...
Android ListView 翻页是初学者都会碰到的问题,但是现在要实现它的方法和实例网上已经很多很多了,但是本菜鸟一直被一个问题所困扰。
是什么问题呢?
咋们先来说说网页上的分页吧,比如每次分页显示是10条记录,那么客户端把要显示的页数和每页要显示的数量发送到服务器,然后服务器根据这两个参数去后来
取数据,页码*页数,就是客户端请求的数据了,而客户端每次请求翻页时,每次显示的都是新的、服务器提交的一页数据。因此当前请求页之外的数据都不在显
示。因此不存在数据一致性的问题。
那我们再来看看手机上的翻页,还是上面的例子,curPageIndex代表当前请求的页码,perPageCount代表每页要显示的数量,假如我还是
每次请求10条记录,第一次提交第一页的时候,手机上获得了10条记录,操作的人在滑动到第十条记录时,客户端又向服务器请求第二页,那么正常情况下应该
是第11~20条记录,但是问题从此开始了,假如服务器上的数据(假如是共享数据,其他用户也可以操作)被其他用户插入一条,而且按照排序规则是在第
1~10记录之间的,那么这时候服务器取的记录虽然还是按照它所理解的11~20条记录,但实际上第11条记录在客户端那边已经存在了,因此客户端获取数
据并加载后,发现第10条记录与第11条记录重复了。
实际上导致这种情况的原因在于三个地方
1、客户端的分页不是类似网页上的纯正分页,而是不断的加载新的数据的同时,老的数据在同一屏上仍旧显示;
2、数据不是客户端的,是共享的,也就是说是可以多个用户同时操作的;
3、有排序规则在,导致新的数据可能插入到之前的老数据中间;
忘大虾赐教!!!
又看了一下, 你给出的方法, 确实很不错, 但就是不太好理解.
我问了一个 老外, 他给出了他的答案, 基本和你说的一样.
In this case you should not get the data using offset and limit. In your json give the database row id. Each time you make a request to php server send this id too. While generating json using this id you can get messages greater than or lesser than rows using sql query. And each time you receive new data in your android application you can update the id value with recent id, so that you can avoid duplicates.
意思说 -> 拿到 id, 然后 用 SQL greater than / lesser than 做区分.
不过, 谢谢了~! @kingpinly 展开
是什么问题呢?
咋们先来说说网页上的分页吧,比如每次分页显示是10条记录,那么客户端把要显示的页数和每页要显示的数量发送到服务器,然后服务器根据这两个参数去后来
取数据,页码*页数,就是客户端请求的数据了,而客户端每次请求翻页时,每次显示的都是新的、服务器提交的一页数据。因此当前请求页之外的数据都不在显
示。因此不存在数据一致性的问题。
那我们再来看看手机上的翻页,还是上面的例子,curPageIndex代表当前请求的页码,perPageCount代表每页要显示的数量,假如我还是
每次请求10条记录,第一次提交第一页的时候,手机上获得了10条记录,操作的人在滑动到第十条记录时,客户端又向服务器请求第二页,那么正常情况下应该
是第11~20条记录,但是问题从此开始了,假如服务器上的数据(假如是共享数据,其他用户也可以操作)被其他用户插入一条,而且按照排序规则是在第
1~10记录之间的,那么这时候服务器取的记录虽然还是按照它所理解的11~20条记录,但实际上第11条记录在客户端那边已经存在了,因此客户端获取数
据并加载后,发现第10条记录与第11条记录重复了。
实际上导致这种情况的原因在于三个地方
1、客户端的分页不是类似网页上的纯正分页,而是不断的加载新的数据的同时,老的数据在同一屏上仍旧显示;
2、数据不是客户端的,是共享的,也就是说是可以多个用户同时操作的;
3、有排序规则在,导致新的数据可能插入到之前的老数据中间;
忘大虾赐教!!!
又看了一下, 你给出的方法, 确实很不错, 但就是不太好理解.
我问了一个 老外, 他给出了他的答案, 基本和你说的一样.
In this case you should not get the data using offset and limit. In your json give the database row id. Each time you make a request to php server send this id too. While generating json using this id you can get messages greater than or lesser than rows using sql query. And each time you receive new data in your android application you can update the id value with recent id, so that you can avoid duplicates.
意思说 -> 拿到 id, 然后 用 SQL greater than / lesser than 做区分.
不过, 谢谢了~! @kingpinly 展开
2个回答
展开全部
在请求第二页及以后页数的时候带多一个参数,就是第一次请求到的数据的最后一条的id,当然服务端的每个数据都有id,id根据你的排序规律,排在前面的可以设置为大点的,最后面的为最小的。服务端根据请求过来id,就可以确认已经发送了此id之前的数据(包括id这条数据,id之前的数据有可能有新的数据插入,但是此时客户端需要的只是之后的数据,所以直接把id之后的10条数据发给客户端即可)。此外,如果客户端想获得新插入的数据,只要请求第一页就行了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
思考了一下,可以这样解决:在请求第二页及以后页数的时候带多一个参数,就是第一次请求到的数据的最后一条的id,当然服务端的每个数据都有id,id根据你的排序规律,排在前面的可以设置为大点的,最后面的为最小的。服务端根据请求过来id,就可以确认已经发送了此id之前的数据(包括id这条数据,id之前的数据有可能有新的数据插入,但是此时客户端需要的只是之后的数据,所以直接把id之后的10条数据发给客户端即可)。此外,如果客户端想获得新插入的数据,只要请求第一页就行了。
追问
没明白...
追答
嗯,我的表述有点乱,你理解就好。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询