基于PageHelper分页插件修改之后的手动分页

       最近写分页的时候遇到一个问题,PageHelper的分页插件只是将数据查出来直接进行分页,而我需要经过拿到全部数据进行统计后选择某些数据进行分页展示,拿到的数据和统计后的数据数目是不一样的,所以需要手动进行分页,所以就根据PageHelper分页插件的源码进行修改PageInfo类形成一个工具类进行手动分页。

import java.util.List;

import com.github.pagehelper.PageInfo;

/**
 * 
 * @ClassName: 
 * @Description: 基于com.github.pagehelper分页插件的手动分页
 * @author 
 * @date 2020年3月15日
 *
 */
public class PageHelperUtils {

	/**
	 * 
	 * @Title: initPageInfo
	 * @Description: 将整理后需要分页的数据list进行分页显示
	 * @param pageNum
	 *            当前页
	 * @param pageSize
	 *            每页显示的数目
	 * @param list
	 *            逻辑处理之后所需要统计的总数据
	 * @return PageInfo<T> 返回PageInfo,这是统计数据中当前页需要显示的数据集合(分页数据)
	 */
	public static <T> PageInfo<T> initPageInfo(int pageNum, int pageSize, List<T> list) {
		int total = list.size();
		// 默认如果当前页小于0则为第一页
		pageNum = pageNum <= 0 ? 1 : pageNum;
		// 默认如果当前页大于最大的页数为当前页
		pageNum = pageNum > (total + pageSize - 1) / pageSize ? (total + pageSize - 1) / pageSize : pageNum;
		// 将需要分页的数组进行截取处理
		int fromIndex = 0;
		int toIndex = 0;
		if (total / pageSize == 0 && total % pageSize > 0) {
			// 表示当前数据只有一页
			fromIndex = 0;
			toIndex = total;
		} else if (total / pageSize >= 1 && total % pageSize >= 0) {
			// 超过一页
			fromIndex = (pageNum - 1) * pageSize;
			toIndex = pageNum * pageSize >= total ? total : pageSize * pageNum;
		}
		// 真正需要分页显示的数据
		List<T> tempList = list.subList(fromIndex, toIndex);
		// 结果集(每页显示的数据)
		PageInfo<T> pageInfo = new PageInfo<>(tempList);
		// 当前页
		pageInfo.setPageNum(pageNum);
		// 每页的数量
		pageInfo.setPageSize(pageSize);
		// 当前页的数量
		pageInfo.setSize(tempList.size());
		// 当前页面第一个元素在数据库中的行号
		pageInfo.setStartRow(0);
		// 当前页面最后一个元素在数据库中的行号
		pageInfo.setEndRow(tempList.size() > 0 ? tempList.size() - 1 : 0);
		// 总记录数
		pageInfo.setTotal(total);
		// 总页数
		pageInfo.setPages((total + pageSize - 1) / pageSize);
		// 计算导航页
		calcNavigatepageNums(pageInfo);
		// 计算前后页,第一页,最后一页
		calcPage(pageInfo);
		// 判断页面边界
		judgePageBoudary(pageInfo);
		return pageInfo;
	}

	/**
	 * 计算导航页
	 */
	private static <T> void calcNavigatepageNums(PageInfo<T> pageInfo) {
		int pages = pageInfo.getPages();
		int navigatePages = pageInfo.getNavigatePages();
		int pageNum = pageInfo.getPageNum();
		// 当总页数小于或等于导航页码数时
		if (pages <= navigatePages) {
			pageInfo.setNavigatepageNums(new int[pages]);
			for (int i = 0; i < pages; i++) {
				pageInfo.getNavigatepageNums()[i] = i + 1;
			}
		} else { // 当总页数大于导航页码数时
			pageInfo.setNavigatepageNums(new int[navigatePages]);
			int startNum = pageNum - navigatePages / 2;
			int endNum = pageNum + navigatePages / 2;

			if (startNum < 1) {
				startNum = 1;
				// (最前navigatePages页
				for (int i = 0; i < navigatePages; i++) {
					pageInfo.getNavigatepageNums()[i] = startNum++;
				}
			} else if (endNum > pages) {
				endNum = pages;
				// 最后navigatePages页
				for (int i = navigatePages - 1; i >= 0; i--) {
					pageInfo.getNavigatepageNums()[i] = endNum--;
				}
			} else {
				// 所有中间页
				for (int i = 0; i < navigatePages; i++) {
					pageInfo.getNavigatepageNums()[i] = startNum++;
				}
			}
		}
	}

	/**
	 * 计算前后页,第一页,最后一页
	 */
	private static <T> void calcPage(PageInfo<T> pageInfo) {
		int[] navigatepageNums = pageInfo.getNavigatepageNums();
		int pageNum = pageInfo.getPageNum();
		int pages = pageInfo.getPages();
		if (navigatepageNums != null && navigatepageNums.length > 0) {
			pageInfo.setFirstPage(navigatepageNums[0]);
			pageInfo.setLastPage(navigatepageNums[navigatepageNums.length - 1]);
			if (pageNum > 1) {
				pageInfo.setPrePage(pageNum - 1);
			}
			if (pageNum < pages) {
				pageInfo.setNextPage(pageNum + 1);
			}
		}
	}

	/**
	 * 判定页面边界
	 */
	private static <T> void judgePageBoudary(PageInfo<T> pageInfo) {
		int pageNum = pageInfo.getPageNum();
		int pages = pageInfo.getPages();
		pageInfo.setIsFirstPage(pageNum == 1);
		pageInfo.setIsLastPage(pageNum == pages);
		pageInfo.setHasPreviousPage(pageNum > 1);
		pageInfo.setHasNextPage(pageNum < pages);
	}

}

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值