`

以list模拟数据源的分页

阅读更多

 

	/**
	 * 分页
	 * @param currentNo 当前页
	 * @param pageSize 每页数量
	 * @param resultList 数据源
	 * @return
	 */
	Page<Map<String, String>> page(int currentNo,int pageSize,List<Map<String, String>> resultList){
		
		currentNo = (currentNo < 1) ? 1 : currentNo;
		//总页数
		int maxPage = resultList.size() % pageSize != 0 ? (resultList.size() / pageSize) + 1 : (resultList.size() / pageSize);
		if(currentNo  > maxPage){
			currentNo = 1;
		}
		int fromIndex = pageSize * (currentNo - 1);
		int toIndex = fromIndex + pageSize;
		
		if(maxPage == currentNo){//最后一页
			toIndex = resultList.size();
		}
		
		List<Map<String, String>> subList = resultList.subList(fromIndex, toIndex);
		return  new Page<Map<String, String>>(fromIndex, resultList.size(), pageSize, subList);
	}

 

 

Page类--------------------------------------------

 

package 

import java.io.Serializable;
import java.util.Collections;
import java.util.List;


public class Page<T> implements Serializable {

	private static final long serialVersionUID = -8478562630743994981L;
	public static int DEFAULT_DISPLAY_PAGE_COUNT = 10;		// 默认展示最多页数
	private static int DEFAULT_PAGE_SIZE = 20;
	private int pageSize = DEFAULT_PAGE_SIZE; // 每页的记录数
	private int start; // 当前页第一条数据在List中的位置,从0开始
	private List<T> data = Collections.emptyList(); // 当前页中存放的记录
	private int totalCount = 0; // 总记录数
	private int pageCount = DEFAULT_DISPLAY_PAGE_COUNT;// 展示最多页数,默认值为DEFAULT_DISPLAY_PAGE_COUNT

	/**
	 * 构造方法,只构造空页.
	 */
	public Page() {
		this(1, 0, DEFAULT_PAGE_SIZE, Collections.<T> emptyList());
	}
	
	/**
	 * 构造方法,只构造空页,pageSize不变
	 */
	public Page(int pageSize) {
		this(1, 0, pageSize, Collections.<T> emptyList());
	}

	/**
	 * 默认构造方法.
	 * @param start 本页数据在数据库中的起始位置
	 * @param totalSize 数据库中总记录条数
	 * @param pageSize 本页容量
	 * @param data 本页包含的数据
	 */
	public Page(int start, int totalSize, int pageSize, List<T> data) {
		this.pageSize = pageSize;
		this.start = start;
		this.totalCount = totalSize;
		this.data = data;
	}

	/** 取总记录数 */
	public int getTotalCount() {
		return this.totalCount;
	}

	/** 取总页数 */
	public int getTotalPageCount() {
		if (totalCount % pageSize == 0)
			return totalCount / pageSize;
		else
			return totalCount / pageSize + 1;
	}

	/** 取每页数据容量 */
	public int getPageSize() {
		return pageSize;
	}

	/** 取当前页中的记录 */
	public List<T> getResult() {
		return data;
	}

	/** 取该页当前页码,页码从1开始 */
	public int getCurrentPageNo() {
		return start / pageSize + 1;
	}
	
	public int getPageNo() {
		return getCurrentPageNo();
	}

	/** 该页是否有下一页 */
	public boolean isHasNextPage() {
		return this.getCurrentPageNo() < this.getTotalPageCount();
	}

	/** 该页是否有上一页 */
	public boolean isHasPreviousPage() {
		return this.getCurrentPageNo() > 1;
	}
	
	
	/**
	 * 取下一页的页码
	 */
	public int getNextPageNo() {
		if (isHasNextPage()) {
			return getCurrentPageNo() + 1;
		}
		return getCurrentPageNo();
	}
	
	/**
	 * 取上一页的页码
	 */
	public int getPreviousPageNo() {
		if (isHasPreviousPage()) {
			return getCurrentPageNo() - 1;
		}
		return getCurrentPageNo();
	}
	
	
	/**
	 * 取首页的页码
	 */
	public int getFirstPageNo() {
		return 1;
	}
	
	/**
	 * 取尾页的页码
	 */
	public int getLastPageNo() {
		return getTotalPageCount();
	}
	
	/**
	 * 取展示页码集
	 */
	public int[] getDisplayNos() {
		// 仅1页
		if (getTotalPageCount() == 1) {
			return null;
		}

		// 总页数不足展示页数
		if (getTotalPageCount() <= pageCount) {
			int[] nos = new int[getTotalPageCount()];
			for (int i = 0; i < nos.length; i++) {
				nos[i] = i + 1;
			}
			return nos;
		}
		
		// 当前页小于展示页码一半,重头总展示
		if (getCurrentPageNo() <= pageCount / 2) {
			int[] nos = new int[pageCount];
			for (int i = 0; i < nos.length; i++) {
				nos[i] = i + 1;
			}
			return nos;
		}
		
		// 当前页与总页数差小于展示页一半,从尾部展示
		if ((getTotalPageCount() - getCurrentPageNo()) <= pageCount / 2) {
			int[] nos = new int[pageCount];
			for (int i = getLastPageNo() - pageCount, j = 0; j < pageCount; i++, j++) {
				nos[j] = i + 1;
			}
			return nos;
		}
		
		// 前后各取一半
		int[] nos = new int[pageCount];
		for (int i = getCurrentPageNo() - pageCount / 2, j = 0;j < pageCount;i++, j++) {
			nos[j] = i + 1;
		}
		return nos;
	}

	/** 获取任一页第一条数据在数据集的位置,每页条数使用默认值 */
	protected static int getStartOfPage(int pageNo) {
		return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE);
	}

	/**
	 * 获取任一页第一条数据在数据集的位置.
	 * @param pageNo 从1开始的页号
	 * @param pageSize 每页记录条数
	 * @return 该页第一条数据
	 */
	public static int getStartOfPage(int pageNo, int pageSize) {
		return (pageNo - 1) * pageSize;
	}


	/**
	 * @param pageCount the pageCount to set
	 */
	public void setPageCount(int pageCount) {
		this.pageCount = pageCount;
	}

	
}

 

 

 

 

 

分享到:
评论

相关推荐

    ListViewDemo(分页)_初学者必备

    在这个项目中,开发者无需依赖外部SQL数据库文件,而是通过在代码中创建List集合来模拟数据源,简化了学习过程。 1. **ListView控件**:ListView是ASP.NET中的一个高度可定制的数据绑定控件,它可以灵活地呈现数据...

    [MVC]bootstrap-table表格ajax获取json数据并分页

    根据这些参数,我们可以从数据库或者其他数据源获取对应的数据,并使用`JsonResult`返回JSON格式的结果,其中`total`字段表示总条目数,`rows`字段是当前页的数据。 此外,为了增强用户体验,我们还可以添加排序、...

    flex datagrid分页

    当设置好Pagination后,我们需要将Pagination的change事件监听器添加到DataGrid,当用户点击分页按钮时,这个事件会被触发,更新DataGrid的数据源。通常,数据源需要支持按页查询,例如使用PagingMemoryProxy或与...

    listview上拉分页加载数据

    ListView通过Adapter来绑定数据,Adapter是连接ListView和数据源的桥梁。在Android中,常见的Adapter有BaseAdapter、ArrayAdapter等,开发者可以根据实际需求选择合适的Adapter实现。 为了实现上拉加载更多的功能,...

    Page类之非sql查询Java 假分页

    6. **合并多个Page对象**:在处理多数据源或合并查询结果时,可能需要将多个Page对象合并成一个大的Page对象。 总的来说,“Page类之非SQL查询Java假分页”是Java开发中一个实用的技术,通过自定义类来实现非SQL...

    mvc datagrid 支持分页功能

    在这个例子中,我们模拟了一个简单的数据源,并根据请求的页面号(`page`)和每页条目数(`rows`)来计算并返回相应数据。实际应用中,你需要将`data`变量替换为从数据库或其他API获取的数据。 最后,别忘了在`...

    struts + hibernate+sprig 的分页源代码

    在分页查询时,Hibernate可以通过HQL(Hibernate Query Language)或SQL来实现,结合Criteria API,可以方便地获取指定范围的数据,并且支持动态SQL生成,以适应不同的分页需求。 3. **Spring框架**: Spring作为...

    GridView 分页

    2. **自定义数据源**:由于我们的目标是无需数据库,我们可以创建一个模拟数据的列表,如`List&lt;string&gt;`或`List&lt;自定义对象&gt;`。在`Page_Load`事件中,根据当前页码加载对应的数据。 ```csharp protected void Page_...

    C#打印操作实例--实现分页打印操作源码-cf.rar

    private List&lt;string&gt; GetData() // 这里应该从实际数据源获取数据 { // 返回模拟数据 return new List() { "数据1", "数据2", ..., "数据N" }; } } ``` 上述代码中,`SetupPrinting`方法用于初始化打印设置,...

    HarmonyOS以长列表联系人为例,演示ListContainer组件的基本使用.zip

    3. **绑定数据源**: 将联系人数据集合(例如ArrayList)与ListContainer进行绑定。这可以通过Adapter类实现,Adapter会根据数据源创建对应的列表项视图。 4. **设置适配器**: 实现自定义的Adapter,覆盖其中的`...

    DataGridView数据绑定

    `DataGridView`不直接提供分页,但可以通过更改数据源的子集或实现`ISupportInitialize`接口来模拟。 9. **数据验证**:可以使用`RowValidating`和`CellValidating`事件来进行数据输入验证,确保输入符合业务规则。...

    JQuery分页

    // 这里模拟数据获取,实际应用中应从数据库或其他数据源获取 var allData = Enumerable.Range(1, totalRecords).ToList(); var startIndex = (pageNumber - 1) * pageSize; var currentPageData = allData.Skip...

    Jetpack-Compose-Pagination:Jetpack组成分页。 使用Jetpack Compose列出分页。 LazyColumn加载更多。 惰性列分页

    `paging-jetpack-compose`和`compose-load-more`标签表明项目可能包含了具体的分页库或自定义实现,用于处理数据源的分页逻辑和加载更多的交互。这可能包括初始化加载第一页,以及在用户滚动到底部时触发加载下一页...

    listview分页

    1. 数据获取:首先,你需要一个数据源,例如服务器API接口,返回一部分数据。在用户滚动到ListView底部时,发送请求获取下一页的数据。 2. 监听滚动事件:在ListView中,你可以通过添加OnScrollListener监听滚动...

    jsp分页技术详解*(适用于初学者)测试通过

    在分页场景中,这个JavaBean会包含获取数据源、计算总页数、以及获取当前页数据的方法。例如,我们可以创建一个`PageBean`类,它拥有`totalItems`(总记录数)、`pageSize`(每页显示数量)、`currentPage`(当前...

    DevExpress的GridView动态绑定数据集,多线程动态修改UI自动刷新

    在多线程环境中,`TestGridView`可能包含用于模拟数据加载或更新的代码,确保在更新GridView的同时,正确处理线程同步问题。这可能涉及到锁机制,如`lock`语句,或者使用`System.Threading.Tasks.Task`和`async/...

    ssm框架集,成另加用户分页查询domo增删改查案例

    在实际应用中,我们会创建一些模拟用户数据,以便于测试和展示功能。 **增删改查**(CRUD)是数据库操作的基础。在SSM框架下,这四个操作可以通过Service层的方法来实现。例如,创建用户时,Service会调用MyBatis的...

    VB 仿千千播放列表List控件

    3. **数据绑定**:将歌曲信息存储在结构化的数据源中,如数组、列表或数据库,然后将这些数据绑定到List控件上。 4. **优化性能**:考虑到大量歌曲可能导致性能问题,需要对数据加载和渲染进行优化,例如分页加载、...

    employee-list-connector:样品接头,支持分页

    这个简单的连接器示例为开发者提供了一个基础模板,他们可以根据需求进行修改和扩展,适应不同的数据源和用户界面需求。无论是在企业级应用还是个人项目中,理解并掌握这种数据加载策略对于提升用户体验和优化性能都...

    json实现jsp分页实例介绍(附效果图).docx

    // 分页数据源 int page = Integer.parseInt(request.getParameter("page")); // 当前得到第几页的记录 int length = 0; // 记录当前拿了多少条 StringBuffer sb = new StringBuffer(); sb.append("["); if ...

Global site tag (gtag.js) - Google Analytics