如何在列表上实现分页?

时间:2013-10-30 16:16:20

标签: java paging

是否有可用于实现列表分页的库?

假设我有10行的空格,用户可以选择是否要按页面向前或向后滚动(因此+ - 10项)。这可能由-1, 0, +1控制。

如果没有足够的项目可以显示,并且要自行保存用户当前页面的状态,这可能会构建一个阻止向后/向前滚动的类。

那还有什么吗?

2 个答案:

答案 0 :(得分:19)

我之前已经解决了这个问题。我创建了一个静态getPages方法,将一个泛型集合分解为一个页面列表(也是列表)。我已经提供了以下代码。

public static <T> List<List<T>> getPages(Collection<T> c, Integer pageSize) {
    if (c == null)
        return Collections.emptyList();
    List<T> list = new ArrayList<T>(c);
    if (pageSize == null || pageSize <= 0 || pageSize > list.size())
        pageSize = list.size();
    int numPages = (int) Math.ceil((double)list.size() / (double)pageSize);
    List<List<T>> pages = new ArrayList<List<T>>(numPages);
    for (int pageNum = 0; pageNum < numPages;)
        pages.add(list.subList(pageNum * pageSize, Math.min(++pageNum * pageSize, list.size())));
    return pages;
}

答案 1 :(得分:14)

次要优化,如果您根本不想创建任何新列表。

/**
 * returns a view (not a new list) of the sourceList for the 
 * range based on page and pageSize
 * @param sourceList
 * @param page, page number should start from 1
 * @param pageSize
 * @return
 */
public static <T> List<T> getPage(List<T> sourceList, int page, int pageSize) {
    if(pageSize <= 0 || page <= 0) {
        throw new IllegalArgumentException("invalid page size: " + pageSize);
    }

    int fromIndex = (page - 1) * pageSize;
    if(sourceList == null || sourceList.size() < fromIndex){
        return Collections.emptyList();
    }

    // toIndex exclusive
    return sourceList.subList(fromIndex, Math.min(fromIndex + pageSize, sourceList.size()));
}