zoukankan      html  css  js  c++  java
  • 分页工具类

    我需要一个类似于百度搜索引擎底部的分页的东西,于是我写了一个工具类

    要生成这么一个分页插件,我需要用到的有:页码列表(是一个Integer[]储存显示出来的所有页码,或者是两个int,只保管第一个页码和最后一个页码)、当前页在页码列表中的位置(因为可能要高亮)、上一页的页码、下一页的页码。

    可能要用到的:当前页的数据条数

    这个工具类只有一个共有的构造方法,接受五个参数

    public Page(List<E> list, int rowsNum, int pageNumber, int pageSize, int maxPageList)

    其中list是数据,rowsNum是总数据量,pageNumber是当前页的页码,pageSize是页面所能容纳的数据的条数,maxPageList是前端分页模块所能容纳的页码的个数

    import java.util.Arrays;
    import java.util.List;
    /**
     * 
     * @author lille 创建于 2019-3-25 上午11:46:15
     * 
     * @param <E>
     */
    public class Page<E> {
    
        /**
         * 
         */
        private static final long serialVersionUID = -5322787339072893931L;
        /**
         * 页码列表长度,创建时指定
         */
        public Integer pageListLength = 8;
        /**
         * 总共多少元素
         */
        public Integer rowsNum;
        /**
         * 每一页的元素个数
         */
        public Integer pageSize;
        /**
         * 当前页的元素个数
         */
        public Integer thisSize;
        /**
         * 可供显示的页码列表(编号)
         */
        public Integer[] pageList;
        /**
         * 列表长度限制,插件中最多可以显示多少个页面的按钮
         */
        public Integer maxPageList;
        /**
         * 当前页在列表中的位置
         */
        public Integer point;
        /**
         * 当前页的编号
         */
        public Integer pageNumber;
        /**
         * 总共多少页
         */
        public Integer pageCount;
        /**
         * 上一页的编号,为-1时没有上一页
         */
        public Integer lastPageNumber;
        /**
         * 下一页的编号,为-1时没有下一页
         */
        public Integer nextPageNumber;
        /**
         * 首页的页码
         */
        public Integer startPageNumber = 1;
        /**
         * 末页的页码
         */
        public Integer endPageNumber;
        /**
         * 当前页的第一行在全部数据中的位置
         */
        public Integer firstLineNumber;
        /**
         * 当前页的最后一行在全部数据中的位置
         */
        public Integer lastLineNumber;
        /**
         * 被包装的数据
         */
        public List<E> data;
        /**
         * 
         * @param list
         *            数据
         * @param rowsNum
         *            总共有多少行
         * @param pageNumber
         *            当前页是第几页
         * @param pageSize
         *            每页有多少行
         * @param maxPageLise
         *            插件中最多可以显示的页码的个数
         */
        public Page(List<E> list, Integer rowsNum, Integer pageNumber, Integer pageSize, Integer maxPageList) {
            if (rowsNum == null || rowsNum < 0) {
                throw new NumberOutOfExpectException("不符合期望的数据量:" + rowsNum);
            } else if (pageSize == null || pageSize <= 0) {
                throw new NumberOutOfExpectException("不符合期望的页面大小:" + pageSize);
            } else if (maxPageList == null || maxPageList <= 0) {
                throw new NumberOutOfExpectException("不符合期望的插件容量:" + maxPageList);
            } else if (pageNumber == null || pageNumber < 0) {
                throw new NumberOutOfExpectException("不符合期望的页面位置:" + pageNumber);
            }
            this.data = list;
            this.rowsNum = rowsNum;
            this.pageNumber = pageNumber;
            this.pageSize = pageSize;
            this.maxPageList = maxPageList;
            this.ini();
        }
        /**
         * 初始化方法
         */
        private void ini() {
            // 计算总共有多少页
            pageCount = rowsNum / pageSize + (rowsNum % pageSize == 0 ? 0 : 1);
            // 末页
            endPageNumber = pageCount;
            // 确保当前页不会超出页码范围
            if (pageNumber > pageCount) {
                pageNumber = pageCount > 0 ? pageCount : 1;
            } else if (pageNumber < 1) {
                pageNumber = 1;
            }
            // 设置页码列表
            pageListLength = pageCount > maxPageList ? maxPageList : pageCount;
            pageList = new Integer[pageListLength];
            // 计算所有标签的内容以及当前页所在标签的位置
            if (pageNumber * 2 <= pageListLength) {
                for (int i = 0; i < pageListLength; i++) {
                    pageList[i] = i + 1;
                }
                point = pageNumber;
            } else if ((pageCount - pageNumber) * 2 <= pageListLength) {
                for (int i = 0; i < pageListLength; i++) {
                    pageList[pageListLength - i - 1] = pageCount - i;
                }
                point = pageListLength - pageCount + pageNumber;
            } else {
                point = pageListLength / 2 + (pageListLength % 2 == 0 ? 0 : 1);
                int temp = pageNumber - point + 1;
                for (int i = 0; i < pageListLength; i++) {
                    pageList[i] = temp + i;
                }
            }
            // 计算当前页的条数,和首行、末行的位置
            if (pageNumber >= pageCount) {
                boolean standard = (rowsNum % pageSize == 0) && (pageNumber == pageCount);
                thisSize = standard ? pageSize : rowsNum % pageSize;
            } else {
                thisSize = pageSize;
            }
            firstLineNumber = (pageNumber - 1) * pageSize + 1;
            lastLineNumber = firstLineNumber + thisSize - 1;
            if (thisSize == 0) {
                firstLineNumber = lastLineNumber;
            }
            // 计算上一页和下一页
            if (pageNumber == pageCount) {
                nextPageNumber = -1;
            } else {
                nextPageNumber = pageNumber + 1;
            }
            if (pageNumber == 1) {
                lastPageNumber = -1;
            } else {
                lastPageNumber = pageNumber - 1;
            }
        }
    
        public static long getSerialversionuid() {
            return serialVersionUID;
        }
        @Override
        public String toString() {
            StringBuilder builder = new StringBuilder();
            builder.append("Page [pageListLength=");
            builder.append(pageListLength);
            builder.append(", rowsNum=");
            builder.append(rowsNum);
            builder.append(", pageSize=");
            builder.append(pageSize);
            builder.append(", thisSize=");
            builder.append(thisSize);
            builder.append(", pageList=");
            builder.append(Arrays.toString(pageList));
            builder.append(", maxPageList=");
            builder.append(maxPageList);
            builder.append(", point=");
            builder.append(point);
            builder.append(", pageNumber=");
            builder.append(pageNumber);
            builder.append(", pageCount=");
            builder.append(pageCount);
            builder.append(", lastPageNumber=");
            builder.append(lastPageNumber);
            builder.append(", nextPageNumber=");
            builder.append(nextPageNumber);
            builder.append(", startPageNumber=");
            builder.append(startPageNumber);
            builder.append(", endPageNumber=");
            builder.append(endPageNumber);
            builder.append(", firstLineNumber=");
            builder.append(firstLineNumber);
            builder.append(", lastLineNumber=");
            builder.append(lastLineNumber);
            builder.append(", data=");
            builder.append(data);
            builder.append("]");
            return builder.toString();
        }
    }
    View Code
    /**
     * 抛出该异常以示该方法接受了数字类型的参数,但是该参数的数值超出了方法的处理范围,使该方法无法以预期的方式运行。<br>
     * 示例:某个方法体中需要将参数作为除法的除数使用,但是在方法的开头对参数检查时却发现该参数的值为零。
     * <pre>
     * public methodName(Integer par) {
     *     if (par == null || par == 0) {
     *         throw new NumberOutOfExpectException("不恰当的参数par:"+par);
     *     }
     *     ...
     *     1 / par
     *     ...
     * }
     * </pre>
     * @author lille 创建于 2019-3-27 上午10:45:58
     *
     */
    public class NumberOutOfExpectException extends IllegalArgumentException {
        
        /**
         * Constructs an <code>NumberOutOfExpectException</code> with no
         * detail message.
         */
        public NumberOutOfExpectException() {
            super();
        }
    
        /**
         * Constructs an <code>NumberOutOfExpectException</code> with the
         * specified detail message.
         *
         * @param   s   the detail message.
         */
        public NumberOutOfExpectException(String s) {
            super(s);
        }
    
        /**
         * Constructs a new exception with the specified detail message and
         * cause.
         *
         * <p>Note that the detail message associated with <code>cause</code> is
         * <i>not</i> automatically incorporated in this exception's detail
         * message.
         *
         * @param  message the detail message (which is saved for later retrieval
         *         by the {@link Throwable#getMessage()} method).
         * @param  cause the cause (which is saved for later retrieval by the
         *         {@link Throwable#getCause()} method).  (A <tt>null</tt> value
         *         is permitted, and indicates that the cause is nonexistent or
         *         unknown.)
         * @since 1.5
         */
        public NumberOutOfExpectException(String message, Throwable cause) {
            super(message, cause);
        }
    
        /**
         * Constructs a new exception with the specified cause and a detail
         * message of <tt>(cause==null ? null : cause.toString())</tt> (which
         * typically contains the class and detail message of <tt>cause</tt>).
         * This constructor is useful for exceptions that are little more than
         * wrappers for other throwables (for example, {@link
         * java.security.PrivilegedActionException}).
         *
         * @param  cause the cause (which is saved for later retrieval by the
         *         {@link Throwable#getCause()} method).  (A <tt>null</tt> value is
         *         permitted, and indicates that the cause is nonexistent or
         *         unknown.)
         * @since  1.5
         */
        public NumberOutOfExpectException(Throwable cause) {
            super(cause);
        }
    
        
        /**
         * 
         */
        private static final long serialVersionUID = 8219283616864206304L;
    
    }
    NumberOutOfExpectException

    基本思路就是

    根据rowsNum和pageSize算出总共会分多少页;

    生成页码列表,列表长度为MIN(总页数,模块所能容纳的页码数);(同时计算当前页在列表中的位置)

    最后计算出上一页和下一页的页码,没有就是-1

  • 相关阅读:
    一本通1621轻拍牛头
    2.23模拟赛
    一本通1618越狱
    P2280 [HNOI2003]激光炸弹
    P4513 小白逛公园
    P2165 [AHOI2009]飞行棋
    P1877 [HAOI2012]音量调节
    P2023 [AHOI2009]维护序列
    P2253 好一个一中腰鼓!
    P2434 [SDOI2005]区间
  • 原文地址:https://www.cnblogs.com/liujinming/p/10598277.html
Copyright © 2011-2022 走看看