stratoflow

Adding pagination to the Visualforce page

When you are starting your adventure with Salesforce, adding pagination might pose some problems. There are plenty of ways of doing this and in today’s blog I’m going to show you my approach which I believe to be fairly easy and straightforward.

At first, in order to implement pagination to your Visualforce page, let’s separate this whole process into two parts: apex controller and visualforce markup. Let’s start with the apex part even though it may seem more complex.

Apex controller

What is necessary for pagination is some sort of list controller. We will call it OrderListIterable. It is an inner class inside the pages controller that implements the Iterator interface for a List of wrapper class objects (OrderPageObject).  Its purpose is to control which part of the list should be displayed based on the state of a table. This Iterable class has 4 attributes:

public List<OrdersB2BPageObject> innerList {get;set;}
public List<OrdersB2BPageObject> listRequested {get;set;}
public Integer i {get;set;}
public Integer setPageSize {get;set;}

InnerList consist of all orders that should be used inside a table. When it comes to ListRequested it is a list that should be displayed at any given time for a user, based on how many elements should be displayed (setPageSize) and which side should they be displayed. That’s what the “i” parameter stands for.

The constructor takes only a list of wrapper class orders and assigns them into the innerList. The rest of attributes is just initialized.

public OrderB2BListIterable(List<OrdersB2BPageObject> orders) {
innerList = new List<OrdersB2BPageObject>();
listRequested = new List<OrdersB2BPageObject>();
innerList = orders;
setPageSize = 10;
i = 0;
}

The class itself contains 4 methods:

  • hasNext(),
  • hasPrevious(),
  • next(),
  • previous()

First two just return a boolean which check whether the innerList contains elements that needs to be added to the requestedList for next or previous button (in the visualforce page). The other 2 methods are responsible for providing the list of objects inside listRequested (size is dependent on the setPageSize attribute). And now brace yourself for a quite long example which contains these 4 methods:

hasNext()

public boolean hasNext() {
if (i >= innerList.size()) {
return false;
} else {
return true;
}
}

hasPrevious()

 public boolean hasPrevious() {
if (i <= setPageSize) {
return false;
} else {
return true;
}
}

next()

public List<OrdersB2BPageObject> next() {
listRequested = new List<OrdersB2BPageObject>();
Integer startNumber;
Integer size = innerList.size();
if (hasNext()) {
if (size <= (i + setPageSize)) {
startNumber = i;
i = size;
} else {
i = (i + setPageSize);
startNumber = (i - setPageSize);
}
for (Integer start = startNumber; start < i; start++) {
listRequested.add(innerList[start]);
}
}
return listRequested;
}

previous()

public List<OrdersB2BPageObject> previous() {
listRequested = new List<OrdersB2BPageObject>();
Integer size = innerList.size();
if (i == size) {
if (Math.mod(size, setPageSize) > 0) {
i = size - Math.mod(size, setPageSize);
} else {
i = (size - setPageSize);
}
} else {
i = (i - setPageSize);
}
for (Integer start = (i - setPageSize); start < i; start++) {
System.debug(i + ', ' + setPageSize);
listRequested.add(innerList[start]);
}
return listRequested;
}
}

Visualforce page

And finally let us move on to the Visualforce page part which is of course way shorter:

<apex:outputPanel>
<apex:commandButton value="{!$Label.previous}" action="{!previous}" rendered="{!hasPrevious}"
reRender="ThePage"/>
<apex:commandButton value="{!$Label.next}" action="{!next}" rendered="{!hasNext}"
reRender="ThePage"/>
</apex:outputPanel>

As you can see in this brief example, two buttons are added to the outputPanel. They rerendered the table after each click and render itself depending on whether the list has any further or previous elements. The pageBlockTable uses the list which is called listController, which uses values from listRequested.

I hope that you can wrap your head around all of this stuff and implement it correctly to your personal projects. Good luck!

Testimonials

The developed software product was built from scratch with solid quality. We have had a long-term engagement with Stratoflow for nearly 10 years. We look at them as partners, rather than contractors. I'm impressed by their team culture and cross-team support.

Nathan Pesin

CTO, Legerity Financials

Stratoflow was a great partner, challenging as well as supporting our customer projects for the best outcome. They have a great pool of talent within the business - all very capability technologists, as well as being business-savvy and suitable for consultancy engagements.

Chris Goodall

Managing Consultant, CG Consultancy (UK) Limited

The bespoke metal exchange platform works great, it is easily accessible and richly functional. Stratoflow managed deadlines capably, meticulously documented their progress, and delivered a complex project at an affordable cost.

Bartlomiej Knichnicki

Vice Chairman, Supervisory Board

We are very pleased with our partnership with Stratoflow and, as we continue to grow, we expect to increase the numbers of developers that work with us on our projects. They have proven to be very skilled and flexible. They're extremely reliable, and they have a very good company culture of their own, which gives them a real edge compared to other providers that serve more as production shops rather than thought partners and creative problem solvers.

Andrew Kennedy

Founder & Managing Director, Tier 2 Consulting

Stratoflow successfully customized the system according to the specific functionalities and without bugs reported. The team was commended for their adaptability in the work process and for their responsiveness.

Joshua Blavins

Tech PM, Digital Agency

The features implemented have received overwhelmingly positive feedback from end-users. Stratoflow has an incredible technical expertise and a high degree of flexibility when it comes to changing project requirements.

Adam Hill

Chief Technology Officer, Legerity

They have impressively good knowledge of AI issues. Very responsive to any amendments and findings. Very good communication. We received a finished project which could be implemented into production shortly after testing.

CO-Founder & CTO

Circular Fashion Company

They provided superb service with seamless communication and a highly professional, technical approach. The team displays impressive technical expertise and are willing to share information and engage in constructive feedback.

Filip Stachnik

Operations Manager, Otwarte Klatki (part of Anima International)

They're very skilled technically and are also able to see the bigger picture. Stratoflow can actually think about solutions, not just the technical task at hand, which they've been assigned.

Arnd Jan Prause

Chief Operating Officer, musQueteer

Stratoflow delivered the website successfully within the timeframe and budget. They assured that the output met the set requirements. Overall, the team's performance was excellent and recommended for their exceptional technical business expertise. They've been able to deliver all of their work on time and within budget, which has been very impressive.

Lars Andersen

Founder & CEO, My Nametags

Travel sector rebound after the pandemic is complete. We have fantastic global coverage of travel data distribution due to mutual agreements and data exchange between aggregators. Competition for the best price of limited resources degradates margins.

How to win? Provide personalized experience and build your own products in the front-office. The missing bits: a traveller golden record collecting past activities and a AI/ML recommendation technology.

Michał Głomba

CEO at Stratoflow