日期:2014-05-16  浏览次数:20411 次

请教一个客户端显示复杂页号的办法?
怎样实现阿里巴巴那样的分页?http://search.china.alibaba.com/search/company_search.htm?province=%C9%CF%BA%A3&biztype=1&begin_page=25

想法是客户端有一个专门生成“页号列表”的方法,给这个方法传入总记录数、总页数,该方法生成页号。

------解决方案--------------------
我写过这样的页号,不过现在没有代码。写一下算法:
1.设定一个showCount,表示最多显示多少个页号。
假如showCount=9,且页面数不小于30页,那么第一页显示:
共xxx条记录,yyy页 (1) 2 3 4 5 6 7 8 9 > > > |
第25页显示
共xxx条记录,yyy页 | < < < 21 22 23 24 (25) 26 27 28 29 > > > |

2.当前页信息需要包括:
pageSize:每页多少条记录
currentPage:当前第几页(从0开始)
totalSize:共有多少条记录
pageSize和currentPage是页面或自己设的,totalSize这个很容易从数据库取到。

这样我们可以计算出一共有Math.ceil(((double)totalSize)/((double)pageSize))页
于是解决了 "共xxx条记录,yyy页 "的部分

3.然后我们计算需要显示的第一个页号和最后一个页号,这个要同时计算
初始 pageCount = 前面计算的页数
a. firstPage = currentPage - (showCount/2); // 显示当前页前面的页号
b. if(firstPage < 0) firstPage = 0; // firstPage不小于0
c. lastPage = firstPage + showCount; // 注意:lastPage并不会显示
// 比如firstPage=0,lastPage=9,只会显示从0-8
d. if(lastPage > pageCount) {
lastPage = pageCount; // lastPage不能比总页数大
firstPage = lastPage - showCount // 尽可能多显示页号
if(firstPage < 0) firstPage = 0; // firstPage不小于0
}

4. 最后我们在页面上显示页号
a. 如果firstPage> 0,那么显示 | < 效果是currentPage = firstPage - 1;
b. 如果currentPage> 0, 那么显示 < < 效果是currentPage = currentPage -1;
c. for(int i=firstPage; i <lastPage; i++)
显示(i+1) 效果是currentPage = i;
d. 如果currentPage <pageCount-1, 那么显示 > > 效果是currentPage = currentPage + 1;
e. 如果lastPage <pageCount-1, 那么显示 > | 效果是currentPage = lastPage;

算法结束