Hello Everyone, In this tutorial, I am going to provide an example that tells you, how to paginate a list of records without a standard controller in Visualforce page.

After completing this tutorial, you’ll able to:
  • Build Pagination without using the standard controller.

So, let’s begin,

Step 1: Login to your Salesforce Org. and open developer console.

Step 2: Navigate to File | New | Apex Class and create an Apex controller called StandardSetController and replace the following code.

StandardSetController.apxc
 public class StandardSetController {    
    public string pageSize {get;set;}    
    public ApexPages.Standardsetcontroller acctSSC {get;set;}    
    
    //Constructor
    public StandardSetController(){        
        pageSize = '5';        
        updateStandardSetController();        
    }
    
    public void updateStandardSetController(){        
        acctSSC = new ApexPages.Standardsetcontroller(Database.getQuerylocator([SELECT Id, name, website, phone FROM Account]));        
        acctSSC.setPageSize(integer.valueOf(pageSize));        
    }   
    
    public List<Account> getAccounts(){        
        return acctSSC.getRecords();        
    }   
    
    public List<SelectOption> getPageSizes(){        
        List<SelectOption> options = new List<SelectOption>();        
        options.add(new SelectOption('5','5'));        
        options.add(new SelectOption('10','10'));        
        options.add(new SelectOption('20','20'));        
        options.add(new SelectOption('50','50'));        
        options.add(new SelectOption('100','100'));        
        return options;        
    }    
    
    public Boolean hasNext{        
        get{            
            return acctSSC.getHasNext();            
        }        
        set;        
    }    
    
    public Boolean hasPrevious{        
        get{            
            return acctSSC.getHasPrevious();            
        }        
        set;        
    }   
    
    public Integer pageNumber{        
        get{            
            return acctSSC.getPageNumber();            
        }        
        set;       
    }
    
    public void previous(){        
        acctSSC.previous();        
    }
    
    public void next(){        
        acctSSC.next();        
    }
 }

Step 3: Navigate to File | New | Visualforce Page and create a new Visualforce Page called PaginationWithoutStdCtrl and replace the following markup.

PaginationWithoutStdCtrl.vfp
 <apex:page controller="StandardSetController" showHeader="false" sidebar="false">    
    <apex:form id="theForm">        
        <apex:pageBlock Title="Account Pagination" id="TablePanel">            
            <apex:outputText value="Page Size"/>            
            <apex:selectList size="1" value="{!pageSize}">                
                <apex:selectOptions value="{!pageSizes}"/>                
                <apex:actionSupport event="onchange" action="{!updateStandardSetController}" rerender="theForm"/>                
            </apex:selectList>            
            <apex:outputPanel layout="block" styleClass="pSearchShowMore" id="otpNav2">                
                <apex:outputText rendered="{!IF(acctSSC.resultSize==10000,true,false)}">Total: 10000 +</apex:outputText>                
                <apex:outputText rendered="{!IF(acctSSC.resultSize < 10000,true,false)}">Total: {!acctSSC.resultSize}</apex:outputText>                
                <apex:image url="/img/search_prevarrow_disabled.gif" rendered="{!NOT(acctSSC.HasPrevious)}"/>                
                <apex:image url="/img/search_prevarrow.gif" title="Previous Page" rendered="{!acctSSC.HasPrevious}"/>                
                <apex:commandLink value="Previous Page" action="{!previous}" rendered="{!acctSSC.HasPrevious}" rerender="TablePanel" />                
                <apex:outputPanel style="color: grey;" rendered="{!NOT(acctSSC.HasPrevious)}">Previous Page</apex:outputPanel>                        
                ({!IF(acctSSC.PageNumber == 1,1,((acctSSC.PageNumber -1) * acctSSC.PageSize)+1)}-{!IF(acctSSC.resultSize < acctSSC.PageSize,acctSSC.resultSize,acctSSC.PageNumber * acctSSC.pageSize)})                 
                <apex:outputPanel style="color:grey;" rendered="{!NOT(acctSSC.HasNext)}">Next Page</apex:outputPanel>                        
                <apex:commandLink action="{!next}" value="Next Page" rendered="{!acctSSC.HasNext}" rerender="TablePanel"/>          
                <apex:image url="/img/search_nextarrow.gif" title="Next Page" rendered="{!acctSSC.HasNext}"/>                
                <apex:image url="/img/search_nextarrow_disabled.gif" rendered="{!NOT(acctSSC.HasNext)}"/>                  
            </apex:outputPanel>            
            <apex:pageBlockTable value="{!accounts}" var="a">                
                <apex:column value="{!a.name}"/>                
                <apex:column value="{!a.website}"/>                
                <apex:column value="{!a.phone}"/>                
            </apex:pageBlockTable>            
        </apex:pageBlock>        
    </apex:form>   
 </apex:page>
Output:



See also:

Conclusion:
Hope you like this tutorial, for any query or suggestions please feel free to comment.
Thank you.