salesforce 零基础学习(四十九)自定义列表分页之使用Pagination实现分页效果 ※※※
上篇内容为Pagination基类的封装,此篇接上篇内容描述如何调用Pagination基类。
首先先创建一个sObject,起名Company info,此object字段信息如下:

为了国际化考虑,setup中输入框输入translate对字段的label进行国际化处理,此处只处理中文。

sobject创建好之后,我们便要进行设计。首先要有一个helper类,对相关查询方法进行封装,然后controller层进行调用以及和page页面交互一个page页面显示。
MyPaginationEnhancement设计:
 public without sharing class MyPaginationEnhancement{
     public static final Integer DEFAULT_PAGE_SIZE=20;
     public MyPaginationEnhancement() {
     }
     public MyPaginationEnhancement(ApexPages.StandardSetController controller) {
     }
     public MyPaginationEnhancement(ApexPages.StandardController controller) {
     }
     private List<sObject> sObjectList;
     private String countStr;
     private String queryStr;
     private String queryCondition;
     private String groupBy;
     private String orderBy;
     private Integer offset=0;
     public List<sObject> resultList{
         get {
             if(sObjectList == null){
                 return new List<sObject>();
             }
             return sObjectList;
         }
         set;
     }
     public List<sObject> getQueryResult(String countStr,String queryStr,String queryCondition){
         setQueryCondition(countStr,queryStr,queryCondition,null,null);
         buildAndQuery();
         return sObjectList;
     }
     public List<sObject> getQueryResult(String countStr,String queryStr,String queryCondition,String groupBy,String orderBy){
         setQueryCondition(countStr,queryStr,queryCondition,groupBy,orderBy);
         buildAndQuery();
         return sObjectList;
     }
     public List<sObject> updateQueryResult(String queryStr,String queryCondition,String groupBy,String orderBy){
         String querySql = queryStr;
         if(queryCondition!=null){
             querySql += queryCondition;
         }
         if(groupBy!=null){
             querySql +=groupBy;
         }
         if(orderBy!=null){
             querySql +=orderBy;
         }
         sObjectList = Database.query(querySql);
         return sObjectList;
     }
     private void setQueryCondition(String countStr,String queryStr,String queryCondition,String groupBy,String orderBy){
         this.countStr=countStr;
         this.queryStr=queryStr;
         this.queryCondition=queryCondition;
         this.groupBy=groupBy;
         this.orderBy=orderBy;
     }
     private void buildAndQuery(){
         List<String> queryArgs = new List<String>();
         List<String> countArgs= new List<String>();
         if(String.isNotBlank(countStr)){
             countArgs.add(countStr);
         }
         if(String.isNotBlank(queryStr)){
             queryArgs.add(queryStr);
         }
         if(String.isNotBlank(queryCondition)){
             queryArgs.add(queryCondition);
             countArgs.add(queryCondition);
         }
         if(String.isNotBlank(groupBy)){
             queryArgs.add(groupBy);
             countArgs.add(groupBy);
         }
         if(String.isNotBlank(orderBy)){
             queryArgs.add(orderBy);
         }
         initTotalNum(countArgs);
         queryResult(queryArgs);
     }    
     private void initTotalNum(List<String> countArgs){
        String countqueryStr=String.join(countArgs,' ');
        if(String.isNotBlank(countqueryStr)){
            totalNumber=Database.countquery(countqueryStr);
        } else {
             totalNumber=0;
        }
        if(totalNumber !=0 && pageNumber==0){
            pageNumber = 1;
        }
     }     
     private List<sObject> queryResult(List<String> queryArgs){
         queryStr=String.join(queryArgs,' ');
         if(String.isBlank(queryStr)){
             sObjectList = new List<sObject>();
         }else{
             String querySql=queryStr+' limit '+pageSize+' offset '+offset;            
             sObjectList = Database.query(querySql);
         }
         return sObjectList;
     }
     public void changePageSize(Integer pageSize) {
         if (pageSize!=null){
             this.pageSize=pageSize;
         }
     }    
     public Boolean hasNext {
         get {
             return pageSize*pageNumber<totalNumber;
         }
         set;
     } 
     public Boolean hasPrevious {
         get {
             return pageSize*(pageNumber-1)>0;
         }
         set;
     } 
     public Integer pageNumber {
         get {
             if(pageNumber==null){
                 pageNumber=0;
             }
             return pageNumber;
         }
         set;
     }
     public Integer pageSize{
         get{
             if(pageSize==null){
                 pageSize=DEFAULT_PAGE_SIZE;
             }
             return pageSize;
         }
         set;
     }
     public Integer totalNumber{
         get{
             if(totalNumber==null){
                 totalNumber=0;
             }
             return totalNumber;
         }
         set;
     }
     public Integer totalPage{
         get{
             if(totalNumber==0 || math.mod(totalNumber,pageSize)!=0){
                 return totalNumber/pageSize+1;
             }else{
                 return totalNumber/pageSize;
             }
         }
         set;
     }
     public Boolean hasRecord{
         get {
             if(totalNumber!=0){
                 return true;
             }else{
                 return false;
             }
         }
         set;
     } 
     public void  first() {
         offset=0;
         pageNumber=1;
     } 
     public void  last() {
         offset=(totalPage-1)*pageSize;
         pageNumber=totalPage;
     } 
     public void  previous() {
         pageNumber--;
         if(pageNumber<0){
             pageNumber=0;
             offset=0;
         }else{
             offset=(pageNumber-1)*pageSize;
         }
     } 
     public void  next() {
         pageNumber++;
         if(pageNumber>totalPage){
             pageNumber=totalPage;
         }
         offset=(pageNumber-1)*pageSize;
     }
      //指定页
     public virtual void specifiedPage(Integer pageNumber) {
         this.pageNumber = pageNumber;
         if(pageNumber < 0) {
             pageNumber = 0;
             offset = 0;
         } else {
             offset = (pageNumber - 1) * pageSize;
         }
     }
     public Integer getOffset(){
             return offset;
     }
     public Integer getSize(){
             return pageSize;
     }    
 }
MyPaginationEnhancement
CompanyHelper设计:
 public without sharing class CompanyHelper {
     public static final String BASE_COMPANY_QUERY = 'SELECT Company_Code_Unique__c, Name,' +
                                                     ' Company_Name__c, Company_Phone__c, Company_Place__c,' +
                                                     ' Company_Type__c, CreatedById, CreatedDate, IsDeleted,' +
                                                     ' Employees_Number__c, LastModifiedById, LastModifiedDate,' +
                                                     ' OwnerId, Id, SystemModstamp FROM Company_Info__c where IsDeleted = false';
     public static final String BASE_COMPANY_COUNT_QUERY = 'SELECT count() from Company_Info__c where IsDeleted = false';
     public static MyPaginationEnhancement getCompanyList(String companyName,String companyCode,String companyPlace,String companyType,MyPaginationEnhancement pagination) {
         String queryCondition= '';
         String orderBy ='';
         if(companyName != null) {
             queryCondition += ' and Company_Name__c like %\'' + companyName + '%\'';
         }
         if(companyCode != null) {
             queryCondition += ' and Company_Code_Unique__c like %\'' + companyCode + '%\'';
         }
         if(companyPlace != null) {
             queryCondition += ' and Company_Place__c like %\'' + companyPlace + '%\'';
         }
         if(companyType != null) {
             queryCondition += ' and Company_Type__c like %\'' + companyType + '%\'';
         }
         orderBy = ' order by createddate';
         pagination.getQueryResult(BASE_COMPANY_COUNT_QUERY,BASE_COMPANY_QUERY,queryCondition,null,orderBy);
        // pagination.getQueryResult();
         return pagination;
     }
 }
CompanyHelper
CompanyController设计
 public with sharing class CompanyController {
     public Map<String,String> parameters;
     public CompanyController() {
         parameters=ApexPages.currentPage().getParameters();
         init();
     }
     public MyPaginationEnhancement pagination = new MyPaginationEnhancement();
     public String companyName{get;set;}
     public String companyCode{get;set;}
     public String companyPlace{get;set;}
     public String companyType{get;set;}
     public void init() {
         queryByCondition();
     }
     public void queryByCondition() {
         CompanyHelper.getCompanyList(companyName,companyCode,companyPlace,companyType,pagination);
         system.debug('====================CurrentPageNumber : ' + pagination.pageNumber);
     }
     public MyPaginationEnhancement resultPagination{
         get{
             if(pagination ==null){
                pagination =new MyPaginationEnhancement();
             }
             return pagination;
         }
         set;
     }
     public List<Company_Info__c> resultList{
         get{
             if(pagination==null || pagination.resultList==null){
                return new List<Company_Info__c>();
             }
             return pagination.resultList;
         }
         set;
     }
     public void firstPage() {
        pagination.first();
        queryByCondition();
     } 
     public void lastPage() {
        pagination.last();
        queryByCondition();
     } 
     public void previousPage() {
        pagination.previous();
        queryByCondition();
     } 
     public void nextPage() {
        pagination.next();
        queryByCondition();
     }
 }
CompanyController
CompanyListPage设计
<apex:page controller="CompanyController">
<apex:form >
<apex:outputPanel layout="block">
<apex:outputPanel layout="block">
<apex:outputPanel layout="block">
<apex:outputPanel layout="block" id="companyList">
<apex:dataTable align="center" value="{!resultList}" var="companyInfo">
<apex:column style="width:180px;">
<apex:facet name="header">{!$ObjectType.Company_Info__c.fields.Company_Code_Unique__c.label}</apex:facet>
<apex:outputText value="{!companyInfo.Company_Code_Unique__c}" />
</apex:column>
<apex:column style="width:180px;">
<apex:facet name="header">{!$ObjectType.Company_Info__c.fields.Company_Name__c.label}</apex:facet>
<apex:outputText value="{!companyInfo.Company_Name__c}" />
</apex:column>
<apex:column style="width:225px;">
<apex:facet name="header">{!$ObjectType.Company_Info__c.fields.Company_Place__c.label}</apex:facet>
<apex:outputText value="{!companyInfo.Company_Place__c}" />
</apex:column>
<apex:column style="width:225px;">
<apex:facet name="header">{!$ObjectType.Company_Info__c.fields.Company_Type__c.label}</apex:facet>
<apex:outputText value="{!companyInfo.Company_Type__c}" />
</apex:column>
<apex:column style="width:225px;">
<apex:facet name="header">{!$ObjectType.Company_Info__c.fields.Employees_Number__c.label}</apex:facet>
<apex:outputText value="{!companyInfo.Employees_Number__c}" />
</apex:column>
<apex:column style="width:500px;">
<apex:facet name="header">操作</apex:facet> </apex:column>
</apex:dataTable> <apex:outputPanel layout="block" styleClass="paginator"
style="padding:0px;">
<apex:panelGrid columns="2" style="width:100%;"
styleClass="az_text_table" rowClasses="paginator,paginator">
<apex:outputText rendered="{!!resultPagination.hasRecord}"
value="第 0 页,共 0 页,每页 {!resultPagination.pageSize} 条" />
<apex:outputText rendered="{!resultPagination.hasRecord}"
value="第 {!resultPagination.pageNumber} 页,共 {!resultPagination.totalPage} 页,每页 {!resultPagination.pageSize} 条" />
<apex:panelGroup >
<apex:outputPanel >
<apex:outputText value="首页"
rendered="{!(!resultPagination.hasRecord)||(!resultPagination.hasPrevious)}"
style="border: solid 1px #ddd;padding:1px 6px;background: #e8e8e9;margin-right:5px;"></apex:outputText>
<apex:commandLink action="{!firstPage}"
rendered="{!resultPagination.hasRecord && resultPagination.hasPrevious}"
immediate="true" reRender="companyList" value="首页"
style="margin-right:5px;" />
</apex:outputPanel>
<apex:outputPanel >
<apex:outputText value="上一页"
rendered="{!!resultPagination.hasRecord || (!resultPagination.hasPrevious)}"
style="border: solid 1px #ddd;padding:1px 6px;background: #e8e8e9;margin-right:5px;"></apex:outputText>
<apex:commandLink action="{!previousPage}"
rendered="{!resultPagination.hasRecord && resultPagination.hasPrevious}"
immediate="true" reRender="companyList" value="上一页"
style="margin-right:5px;" />
</apex:outputPanel>
<apex:outputPanel >
<apex:outputText value="{!resultPagination.pageNumber}"
styleClass="current" />
</apex:outputPanel>
<apex:outputPanel >
<apex:outputText value="下一页"
rendered="{!!resultPagination.hasRecord || !resultPagination.hasNext}"
style="border: solid 1px #ddd;padding:1px 6px;background: #e8e8e9;margin-right:5px;margin-left:5px;"></apex:outputText>
<apex:commandLink action="{!nextPage}"
rendered="{!resultPagination.hasRecord && resultPagination.hasNext}"
immediate="true" reRender="companyList" value="下一页"
style="margin-right:5px;margin-left:5px;" />
</apex:outputPanel>
<apex:outputPanel >
<apex:outputText value="尾页"
rendered="{!!resultPagination.hasRecord || !resultPagination.hasNext}"
style="border: solid 1px #ddd;padding:1px 6px;background: #e8e8e9;margin-right:5px;"></apex:outputText>
<apex:commandLink action="{!lastPage}"
rendered="{!resultPagination.hasRecord && resultPagination.hasNext}"
immediate="true" reRender="companyList" value="尾页"
style="margin-right:5px;" />
</apex:outputPanel>
</apex:panelGroup>
</apex:panelGrid>
</apex:outputPanel>
</apex:outputPanel>
</apex:outputPanel>
</apex:outputPanel>
</apex:outputPanel>
</apex:form>
</apex:page>
CompanyListPage
其中,CompanyListPage中没有对页面进行样式调整,也没有做相关search,new,edit以及view的操作,感兴趣的小伙伴可以自行补充。
显示效果:
1.语言为英文(我的默认语言)情况下:

2.语言为中文情况下:

3.翻页效果:

4.尾页效果:

总结:此篇结合上篇实现了如果不用标准界面的分页自己创建分页的实例展示,其中有考虑不细致的地方,比如offset超过2000应该有一定提示等,也有没有做完的地方,比如模糊搜索和增删改功能。如果篇中有错误地方欢迎指正,如果有不懂的地方欢迎留言。(ps:效果显示请忽略UI)
salesforce 零基础学习(四十九)自定义列表分页之使用Pagination实现分页效果 ※※※的更多相关文章
- salesforce 零基础学习(十九)Permission sets 讲解及设置
		Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Pro ... 
- salesforce零基础学习(九十九)Git 在salesforce项目中的应用(vs code篇)
		本篇参考: https://code.visualstudio.com/docs/editor/versioncontrol https://git-scm.com/doc https://git-s ... 
- salesforce零基础学习(九十九)Salesforce Data Skew(数据倾斜)
		本篇参考: https://developer.salesforce.com/blogs/engineering/2013/04/managing-lookup-skew-to-avoid-recor ... 
- salesforce 零基础学习(十八)WorkFlow介绍及用法
		说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ... 
- salesforce 零基础学习(十六)Validation Rules & Date/time
		上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ... 
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
		项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ... 
- salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
		在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ... 
- salesforce 零基础学习(五十二)Trigger使用篇(二)
		第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ... 
- salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现
		项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ... 
- salesforce 零基础学习(六十八)http callout  test class写法
		此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ... 
随机推荐
- oracle(sql)基础篇系列(五)——PLSQL、游标、存储过程、触发器
			PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语 ... 
- webpack -p压缩打包react报语法错误处理
			前言:在用webpack打包react代码的时候发现一个问题,做一个处理总结. 我的webpack配置: var webpack = require('webpack'); //打包less插件 va ... 
- 通过url传参
			简介: 通过url传单个和多个参数 你得配Route; 你得使用ui-sref传参数; 在你相关Route的Controller里面Inject $stateParams,然后取参数就OK. 实例: ... 
- Jungle Roads[HDU1301]
			Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ... 
- linux 用户管理
			linux 用户管理 创建一个用户 foo 这个用户只能在/home/foo 上面增加删除文件, foo 不能在其他目录加减文件 useradd -d /home/foo -m foo [root@] ... 
- 【AspNet Core】Nuget代理网站
			因为访问Nuget太慢,在Dotnet Core RC2发布前,我就基于Asp.Net做了一个Nuget代理网站 这是网站地址:http://nuget.lzzy.net/ Nuget源:http:/ ... 
- MVC高级编程+C#高级编程
			本人今年的目标是学习MVC高级编程和C#高级编程,把自己的基础打的扎实,本文中值是一个开到,定期会在上面记录学习的技术点和心得就,加油吧!!!!! 
- WPF-禁止二次启动
			App.xaml.cs protected override void OnStartup(StartupEventArgs e) { //禁止二次启动 this.Startup += new Sta ... 
- Angular初步
			一.angular.js是什么? angular.js是一个javascript的框架,与jquery是一个级别的,区别是jquery主要是擅长dom操作,而angular主要是擅长绑定数据显示数据. ... 
- 【Telerik】<telerik:RadComboBox>导出列表数据
			近来在做项目,做到导出功能.使用<telerik:RadComboBox>的下拉框来实现导出部分或导出所有数据的功能. 
