用pageInfo對List手工分頁


因業務需要,需對List,進行分頁。

List來源,多種多樣,有時不能用數據庫發送sql來進行limit的分頁

思路:

1.對List數組來源,進行subList的截取,類似於數據庫發送limit。

2.構建一個pageinfo的工具類。

List<Description> descriptionByCategoryList = descriptionService.getDescriptionByCategoryList(20);

        int fromIndex = 0;
        int toIndex = 0;
        int pageSize = 20;
        int pageIndex = pn;
        int total = descriptionByCategoryList.size(); // 取出總記錄數
        if (total / pageSize == 0 && total % pageSize > 0) {
            fromIndex = 0;
            toIndex = total;
        } else {
            if (total / pageSize >= 1 && total % pageSize >= 0) {
                fromIndex = pageSize * (pageIndex - 1);
                if (pageSize * pageIndex >= total) {
                    toIndex = total;
                } else {
                    toIndex = pageSize * pageIndex;
                }
            }
        }

  //做pn越界處理

    try {
          descriptionByCategoryList =descriptionByCategoryList.subList(fromIndex, toIndex);
     } catch (IndexOutOfBoundsException e) {
        fromIndex = 0;
        toIndex= pageSize;
        descriptionByCategoryList =descriptionByCategoryList.subList(fromIndex, toIndex);
      }catch(IllegalArgumentException e) {
         fromIndex = total-pageSize;
         toIndex =total;
      descriptionByCategoryList =descriptionByCategoryList.subList(fromIndex, toIndex);
     }



        descriptionByCategoryList = descriptionByCategoryList.subList(fromIndex, toIndex);  //進行分頁  
        PageInfo<Description> page = new PageInfo<Description>(descriptionByCategoryList, 7);
        page = PageHelperTool.initPageInfoObj(pageIndex, total, pageSize, page);  //調用分頁工具
        mv.addObject("pageinfo", page);

 

分頁工具類

package cn.taotao.utils;

import com.github.pagehelper.PageInfo;

/**
  * @Title: PageHelperTool.java
 * @Package
 * @Description: 分頁工具類
 */
public class PageHelperTool {
    /**
     * PageHelper中,如果當前頁是最后一頁,則返回的nextPage是0,即首頁,而有時我們需要最后一頁的nextPage是lastPage,因此寫此方法
     * 
     * @param currentPage
     * @param pageObj
     * @return
     */
    public static <T> PageInfo<T> lastPageSetNextPage(int currentPage, PageInfo<T> pageObj) {
        if (currentPage == pageObj.getPages()) {
            pageObj.setNextPage(pageObj.getPages());
        }
        return pageObj;
    }

    public static <T> PageInfo<T> initPageInfoObj(int currentPage, int total, int pageSize, PageInfo<T> pageInfo) {
        pageInfo.setNextPage(currentPage < ((total + pageSize - 1) / pageSize) ? currentPage + 1 : currentPage);
        pageInfo.setTotal(total);
        pageInfo.setPageNum(currentPage);
        pageInfo.setPages((total + pageSize - 1) / pageSize);
        pageInfo.setLastPage((total + pageSize - 1) / pageSize);
        pageInfo.setPrePage(currentPage > 1 ? currentPage - 1 : currentPage);
        pageInfo.setIsFirstPage(currentPage == 1 ? true : false);
        pageInfo.setIsLastPage(currentPage == (total + pageSize - 1) / pageSize ? true : false);
        pageInfo.setHasPreviousPage(currentPage == 1 ? false : true);
        pageInfo.setHasNextPage(currentPage == (total + pageSize - 1) / pageSize ? false : true);
        return calcNavigatepageNums(pageInfo);
    }

    private static <T> PageInfo<T> calcNavigatepageNums(PageInfo<T> pageInfo) {
        // 當總頁數小於或等於導航頁碼數時
        if (pageInfo.getPages() <= pageInfo.getNavigatePages()) {
            pageInfo.setNavigatepageNums(new int[pageInfo.getPages()]);
            for (int i = 0; i < pageInfo.getPages(); i++) {
                pageInfo.getNavigatepageNums()[i] = i + 1;
            }
        } else { // 當總頁數大於導航頁碼數時
            pageInfo.setNavigatepageNums(new int[pageInfo.getNavigatePages()]);
            int startNum = pageInfo.getPageNum() - pageInfo.getNavigatePages() / 2;
            int endNum = pageInfo.getPageNum() + pageInfo.getNavigatePages() / 2;

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

}

 

題外另外,需要在排序的類,重寫自定義compare的規則。就是說,讓他知道如何排序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM