com.dexcoder.commons.pager.Pager Maven / Gradle / Ivy
package com.dexcoder.commons.pager;
import java.io.Serializable;
import java.util.List;
import com.dexcoder.commons.bean.BeanConverter;
/**
* 分页工具类
*
* 此类用于分页时显示多项内容,计算页码和当前页的偏移量。
*
*
*
* 该类只需要知道总的数据项数,当前显示第几页,每页显示几项,就可以帮你计算出其它数据,而且保证所有计算都得出合理的值,不用担心页码超出边界之类的问题。
*
*
*
* 使用方法如下:
*
>>
* // ^ ^ ^ ^ ^
* // 第一页 前一页 当前页 后一页 最后一页
* //
* // 以上例子就是一个大小为7的滑动窗口,当前页码被尽可能摆在中间,除非当前页位于开头或结尾。
* // 使用下面的调用,就可以得到指定大小的滑动窗口中的页码数组。
* int[] slider = pg.getSlider(7);
*
* // 这样可以判断指定页码是否有效,或者是当前页。无效的页码在web页面上不需要链接。
* if (pg.isDisabledPage(slider[i])) {
* show = "page " + slider[i];
* } else {
* show = " page " + slider[i] + " ";
* }
*
* // 可以直接打印出pg,用于调试程序。
* System.out.println(pg);
* log.debug(pg);
*
* ]]>
*
*
* @author liyd
* @version $Id: Pager.java, v 0.1 2012-4-19 上午9:38:48 liyd Exp $
*/
public class Pager implements Serializable {
/** serialVersionUID */
private static final long serialVersionUID = 8852394572921412518L;
/** 每页默认的项数 */
public static final int DEFAULT_ITEMS_PER_PAGE = 50;
/** 滑动窗口默认的大小 */
public static final int DEFAULT_SLIDER_SIZE = 7;
/** 当前页码 */
private int curPage;
/** 总记录数 */
private int itemsTotal;
/** 每页记录数 */
private int itemsPerPage;
/** 分页的列表数据 */
private List> list;
/**
* 创建一个分页器,默认每页显示50
项。
*/
public Pager() {
this.itemsPerPage = DEFAULT_ITEMS_PER_PAGE;
this.curPage = 1;
this.itemsTotal = Integer.MAX_VALUE;
}
/**
* 取得总页数。
*
* @return 总页数
*/
public int getPages() {
return (int) Math.ceil((double) itemsTotal / itemsPerPage);
}
/**
* 取得当前页。
*
* @return 当前页
*/
public int getCurPage() {
return curPage;
}
/**
* 设置并取得当前页。实际的当前页值被确保在正确的范围内。
*
* @param page 当前页
*
* @return 设置后的当前页
*/
public int setCurPage(int page) {
return (this.curPage = calcPage(page));
}
/**
* 取得总项数。
*
* @return 总项数
*/
public int getItemsTotal() {
return this.itemsTotal;
}
public List> getList() {
return list;
}
public void setList(List> list) {
this.list = list;
}
/**
* 返回转换后的数据
*
* @return
*/
@SuppressWarnings("unchecked")
public List getList(Class clazz) {
if (clazz == null) {
throw new IllegalArgumentException("Conversion failed,Parameter class can not be null!");
}
if (this.list == null || this.list.isEmpty()) {
return null;
}
if (this.list.iterator().next().getClass().equals(clazz)) {
return (List) this.list;
}
return BeanConverter.convert(clazz, list);
}
/**
* 设置并取得总项数。如果指定的总项数小于0,则被看作0。自动调整当前页,确保当前页值在正确的范围内。
*
* @param items 总项数
*
* @return 设置以后的总项数
*/
public int setItemsTotal(int items) {
this.itemsTotal = (items >= 0) ? items : 0;
setCurPage(curPage);
return this.itemsTotal;
}
/**
* 取得每页项数。
*
* @return 每页项数
*/
public int getItemsPerPage() {
return itemsPerPage;
}
/**
* 设置并取得每页项数。如果指定的每页项数小于等于0,则使用默认值DEFAULT_ITEMS_PER_PAGE
。 并调整当前页使之在改变每页项数前后显示相同的项。
*
* @param itemsPerPage 每页项数
*
* @return 设置后的每页项数
*/
public int setItemsPerPage(int itemsPerPage) {
this.itemsPerPage = (itemsPerPage > 0) ? itemsPerPage : DEFAULT_ITEMS_PER_PAGE;
if (curPage > 0) {
setCurPage((int) (((double) (curPage - 1) * this.itemsPerPage) / this.itemsPerPage) + 1);
}
return this.itemsPerPage;
}
/**
* 取得当前页第一项在全部项中的偏移量 (0-based)。
*
* @return 偏移量
*/
public int getOffset() {
return (curPage > 0) ? (itemsPerPage * (curPage - 1)) : 0;
}
/**
* 取得当前页的长度,即当前页的实际项数。相当于 endIndex() - beginIndex() + 1
*
* @return 当前页的长度
*/
public int getActualLength() {
if (curPage > 0) {
return Math.min(itemsPerPage * curPage, itemsTotal) - (itemsPerPage * (curPage - 1));
} else {
return 0;
}
}
/**
* 取得当前页显示的项的起始序号 (1-based)。
*
* @return 起始序号
*/
public int getBeginIndex() {
if (curPage > 0) {
return (itemsPerPage * (curPage - 1));
} else {
return 0;
}
}
/**
* 取得当前页显示的末项序号 (1-based)。
*
* @return 末项序号
*/
public int getEndIndex() {
if (curPage > 0) {
return Math.min(itemsPerPage * curPage, itemsTotal);
} else {
return 0;
}
}
/**
* 设置第几条记录,使之返回该条记录所在的页数据项
*
* 如每页显示10条,设置25,将返回第25条记录所在页的数据项(21-30)
*
* @param offset 要显示的项位置
*
* @return 指定项所在的页
*/
public int setOffset(int offset) {
return setCurPage((offset / itemsPerPage) + 1);
}
/**
* 取得首页页码。
*
* @return 首页页码
*/
public int getFirstPage() {
return calcPage(1);
}
/**
* 取得末页页码。
*
* @return 末页页码
*/
public int getLastPage() {
return calcPage(getPages());
}
/**
* 取得前一页页码。
*
* @return 前一页页码
*/
public int getPreviousPage() {
return calcPage(curPage - 1);
}
/**
* 取得前n页页码
*
* @param n 前n页
*
* @return 前n页页码
*/
public int getPreviousPage(int n) {
return calcPage(curPage - n);
}
/**
* 取得后一页页码。
*
* @return 后一页页码
*/
public int getNextPage() {
return calcPage(curPage + 1);
}
/**
* 取得后n页页码。
*
* @param n 后n面
*
* @return 后n页页码
*/
public int getNextPage(int n) {
return calcPage(curPage + n);
}
/**
* 判断指定页码是否被禁止,也就是说指定页码超出了范围或等于当前页码。
*
* @param page 页码
*
* @return boolean 是否为禁止的页码
*/
public boolean isDisabledPage(int page) {
return ((page < 1) || (page > getPages()) || (page == this.curPage));
}
/**
* 取得默认大小(DEFAULT_SLIDER_SIZE
)的页码滑动窗口,并将当前页尽可能地放在滑动窗口的中间部位。参见{@link #getSlider(int
* n)}。
*
* @return 包含页码的数组
*/
public int[] getSlider() {
return getSlider(DEFAULT_SLIDER_SIZE);
}
/**
* 取得指定大小的页码滑动窗口,并将当前页尽可能地放在滑动窗口的中间部位。例如: 总共有13页,当前页是第5页,取得一个大小为5的滑动窗口,将包括 3,4,5,6,
* 7这几个页码,第5页被放在中间。如果当前页是12,则返回页码为 9,10,11,12,13。
*
* @param pWidth 滑动窗口大小
*
* @return 包含页码的数组,如果指定滑动窗口大小小于1或总页数为0,则返回空数组。
*/
public int[] getSlider(int pWidth) {
int width = pWidth;
int pages = getPages();
if ((pages < 1) || (width < 1)) {
return new int[0];
} else {
if (width > pages) {
width = pages;
}
int[] slider = new int[width];
int first = curPage - ((width - 1) / 2);
if (first < 1) {
first = 1;
}
if (((first + width) - 1) > pages) {
first = pages - width + 1;
}
for (int i = 0; i < width; i++) {
slider[i] = first + i;
}
return slider;
}
}
/**
* 计算页数,但不改变当前页。
*
* @param page 页码
*
* @return 返回正确的页码(保证不会出边界)
*/
protected int calcPage(int page) {
int pages = getPages();
if (pages > 0) {
return (page < 1) ? 1 : ((page > pages) ? pages : page);
}
return 0;
}
/**
* 转换成字符串表示。
*
* @return 字符串表示。
*/
public String toString() {
StringBuffer sb = new StringBuffer("Pager: page ");
if (getPages() < 1) {
sb.append(getCurPage());
} else {
int[] slider = getSlider();
for (int i = 0; i < slider.length; i++) {
if (isDisabledPage(slider[i])) {
sb.append('[').append(slider[i]).append(']');
} else {
sb.append(slider[i]);
}
if (i < (slider.length - 1)) {
sb.append('\t');
}
}
}
sb.append(" of ").append(getPages()).append(",\n");
sb.append(" Showing items ").append(getBeginIndex()).append(" to ").append(getEndIndex()).append(" (total ")
.append(getItemsTotal()).append(" items), ");
sb.append("offset=").append(getOffset()).append(", length=").append(getActualLength());
return sb.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy