for what its worth I modified ListPagingPlugin to support previous page as well as the existing next page...
Code:
Ext.override(Ext.plugins.ListPagingPlugin, { loadPreviousText: 'Previous Page',
render : function() {
var list = this.list,
targetEl = list.getTargetEl(),
html = '',
phtml = '';
if (!this.autoPaging) {
html += '<div class="x-list-paging-msg">' + this.loadMoreText + '</div>';
phtml += '<div class="x-list-paging-msg">' + this.loadPreviousText + '</div>';
}
this.firstEl = targetEl.insertFirst({
cls: 'x-list-paging' + (this.autoPaging ? ' x-loading' : ''),
html: phtml + Ext.LoadingSpinner
});
this.el = targetEl.createChild({
cls: 'x-list-paging' + (this.autoPaging ? ' x-loading' : ''),
html: html + Ext.LoadingSpinner
});
if (this.autoPaging) {
this.mon(targetEl.getScrollParent(), 'scrollend', this.onScrollEnd, this);
}
else {
this.mon(this.el, 'tap', this.onPagingTap, this);
this.mon(this.firstEl, 'tap', this.onPreviousPagingTap, this);
}
this.rendered = true;
},
onPreviousPagingTap : function(e) {
if (!this.loading) {
this.loading = true;
this.list.store.previousPage();
this.firstEl.addCls('x-loading');
}
},
onListUpdate : function() {
if (!this.list.store) {
return false;
}
if (!this.rendered) {
this.render();
}
if (!this.autoPaging) {
var storeReader = this.list.store.proxy.reader;
var totalRecords = storeReader.jsonData[storeReader.totalProperty];
if (totalRecords <= (this.list.store.currentPage * this.list.store.pageSize)) {
}
else {
this.el.appendTo(this.list.getTargetEl());
this.el.removeCls('x-loading');
}
if (this.list.store.currentPage == 1) {
}
else {
this.list.getTargetEl().insertFirst(this.firstEl);
this.firstEl.removeCls('x-loading');
}
}
this.loading = false;
},
onScrollEnd : function(scroller, pos) {
if (pos.y >= Math.abs(scroller.offsetBoundary.top)) {
this.loading = true;
this.list.store.nextPage();
}
else if (pos.y == 0) {
this.loading = true;
this.list.store.previousPage();
}
}
});