Flex的一点入门经验(4)--分页,又见分页

基本各种列表都和分页有着密不可分的关系.
在barServer这个工程里,我们首先添加一个新的实体类Product,然后添加一个公共的分页结果对象.

package com.crap.common;

import java.util.List;

public class Pagination<T> {

//当前页数
private int currentPageNumber;

//总页数
private int totalPageNumber;

//当前页的item list
private List<T> itemList;

// 省略getter和setter
}


这样无论是学生的分页结果还是product的分页结果,都可以用这个对象返回.
StudentService类中两个模拟的分页查询方法如下

public Pagination<Student> paginateStudent() {
Pagination<Student> result = new Pagination<Student>();
result.setCurrentPageNumber(3);
result.setTotalPageNumber(5);
result.setItemList(this.studentDao.findStudentList());
return result;
}

public Pagination<Product> paginateProduct() {
Pagination<Product> result = new Pagination<Product>();
result.setCurrentPageNumber(2);
result.setTotalPageNumber(8);

List<Product> list = new ArrayList<Product>();

Product p = new Product();
p.setId(0);
p.setName("product 1");
p.setPrice(34.2);
p.setOnline(true);
list.add(p);

p = new Product();
p.setId(1);
p.setName("product 2");
p.setPrice(14);
p.setOnline(true);
list.add(p);

p = new Product();
p.setId(2);
p.setName("product 3");
p.setPrice(380);
p.setOnline(true);
list.add(p);

result.setItemList(list);

return result;
}


flex端同样定义对应的分页对象

package com.crap.model{
import mx.collections.ArrayCollection;

[Bindable]
[RemoteClass(alias="com.crap.common.Pagination")]
public class FlexPagination
{
public function FlexPagination()
{
}

private var _currentPageNumber :int;

private var _totalPageNumber :int;

private var _itemList:ArrayCollection;

//省略setter和getter

}
}


这样就可以使用这个FlexPagination了


<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:crap="com.crap.components.*"
minWidth="955" minHeight="600">
<fx:Declarations>
<s:RemoteObject id="studentRO" destination="student">
<s:method name="paginateStudent" result="onPaginationStudent(event)"/>
<s:method name="paginateProduct" result="onPaginationProduct(event)"/>
</s:RemoteObject>

</fx:Declarations>

<fx:Script>
<![CDATA[
import com.crap.event.PaginationEvent;
import com.crap.model.FlexPagination;

import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;



[Bindable]
private var studentList:ArrayCollection;

[Bindable]
private var productList:ArrayCollection;

private function onPaginationStudent(event:ResultEvent):void{
var pagination:FlexPagination=event.result as FlexPagination;
studentList=pagination.itemList;
pagination1.currentNumber=pagination.currentPageNumber;
pagination1.totalNumber=pagination.totalPageNumber;
}

private function onPaginationProduct(event:ResultEvent):void{
var pagination:FlexPagination=event.result as FlexPagination;
productList=pagination.itemList;
pagination2.currentNumber=pagination.currentPageNumber;
pagination2.totalNumber=pagination.totalPageNumber;
}

private function onPageChanged(pageEvent:PaginationEvent):void{
Alert.show("我们要跳转到"+pageEvent.destinationPageNumber);
}

]]>
</fx:Script>



<s:VGroup>
<s:Button label="刷新1" click="studentRO.paginateStudent()"/>
<s:Button label="刷新2" click="studentRO.paginateProduct()"/>

<crap:PaginationHalo id="pagination1" pageChanged="onPageChanged(event)"/>
<s:DataGrid id="studentDG" width="100%" dataProvider="{studentList}">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="id" headerText="ID"/>
<s:GridColumn dataField="name" headerText="姓名"/>
</s:ArrayList>
</s:columns>
</s:DataGrid>

<crap:PaginationSpark id="pagination2" pageChanged="onPageChanged(event)"/>
<s:DataGrid id="productDG" width="100%" dataProvider="{productList}">
<s:columns>
<s:ArrayList>
<s:GridColumn dataField="id" headerText="ID"/>
<s:GridColumn dataField="name" headerText="姓名"/>
<s:GridColumn dataField="price" headerText="价格"/>
<s:GridColumn dataField="online" headerText="是否上架"/>
</s:ArrayList>
</s:columns>
</s:DataGrid>
</s:VGroup>



</s:Application>

效果如图所示
[img]http://dl.iteye.com/upload/picture/pic/125228/c869c029-945e-35f2-bd13-5197e163d937.jpg[/img]

我们在这里新定义了一个PaginationEvent类,多了一个目标页数_destinationPageNumber这个属性.
对于分页控件,则可以用以下两种方式实现

1 Repeater.
barClient/src/com/crap/components/PaginationHalo.mxml内容如下

<?xml version="1.0" encoding="utf-8"?>
<s:HGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="400" height="20">

<fx:Script>
<![CDATA[
import com.crap.event.PaginationEvent;

import mx.collections.ArrayCollection;

private var _totalNumber:int;

[Bindable]
private var _currentNumber:int;

[Bindable]
private var dataProvider:ArrayCollection=new ArrayCollection();

private function nextPage():void{
var event:PaginationEvent=new PaginationEvent("pageChanged",true,true);
event.destinationPageNumber=this._currentNumber+1;
this.dispatchEvent(event);
}

private function previousPage():void{
var event:PaginationEvent=new PaginationEvent("pageChanged",true,true);
event.destinationPageNumber=this._currentNumber-1;
this.dispatchEvent(event);
}

private function gotoPage(pageNumber:int):void{
var event:PaginationEvent=new PaginationEvent("pageChanged",true,true);
event.destinationPageNumber=pageNumber;
this.dispatchEvent(event);
}

public function set currentNumber(value:int):void
{
_currentNumber = value;
}


public function set totalNumber(value:int):void
{
_totalNumber = value;
dataProvider.removeAll();
for(var i:int=1;i<=value;i++){
this.dataProvider.addItem({pageNumber:i});
}
}

]]>
</fx:Script>

<fx:Metadata>
[Event(name="pageChanged", type="com.crap.event.PaginationEvent")]
</fx:Metadata>

<s:Button label="上一页" click="previousPage();">

</s:Button>

<mx:HBox>
<mx:Repeater id="rep" dataProvider="{dataProvider}">
<s:Button label="第{rep.currentItem.pageNumber}页"
click="gotoPage(event.target.getRepeaterItem().pageNumber);"
enabled="{rep.currentItem.pageNumber!=_currentNumber}">

</s:Button>
</mx:Repeater>
</mx:HBox>


<s:Button label="下一页" click="nextPage();">

</s:Button>

</s:HGroup>


Repeater是halo包里的,它必须出现在一个halo容器里,所以用一个HBox包住了它.注意它里面button的产生label可以用currentItem指代当前的Item,但是绑定handler的时候,要用getRepeaterItem().因为当handler被触发的时候,repeate已经结束了.

2 DataGroup
barClient/src/com/crap/components/PaginationSpark.mxml内容如下

<?xml version="1.0" encoding="utf-8"?>
<s:HGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
width="400" height="20">

<fx:Metadata>
[Event(name="pageChanged", type="com.crap.event.PaginationEvent")]
</fx:Metadata>
<fx:Script>
<![CDATA[
import com.crap.event.PaginationEvent;

import mx.collections.ArrayCollection;


private var _totalNumber:int;

private var _currentNumber:int;

[Bindable]
private var dataProvider:ArrayCollection=new ArrayCollection();


public function set currentNumber(value:int):void
{
_currentNumber = value;
}


public function set totalNumber(value:int):void
{
_totalNumber = value;
dataProvider.removeAll();
for(var i:int=1;i<=value;i++){
this.dataProvider.addItem({pageNumber:i});
}
}

private function nextPage():void{
var event:PaginationEvent=new PaginationEvent("pageChanged",true,true);
event.destinationPageNumber=this._currentNumber+1;
this.dispatchEvent(event);
}

private function previousPage():void{
var event:PaginationEvent=new PaginationEvent("pageChanged",true,true);
event.destinationPageNumber=this._currentNumber-1;
this.dispatchEvent(event);
}
]]>
</fx:Script>
<s:Button label="上一页" click="previousPage();">

</s:Button>

<s:DataGroup dataProvider="{dataProvider}">
<s:layout>
<s:HorizontalLayout/>
</s:layout>
<s:itemRenderer>

<fx:Component>
<s:GridItemRenderer>
<s:Button label="第{data.pageNumber}页">
<fx:Script>
<![CDATA[
import com.crap.event.PaginationEvent;
]]>
</fx:Script>
<s:click>
<![CDATA[
var paginationEvent:PaginationEvent=new PaginationEvent("pageChanged",true,true);
paginationEvent.destinationPageNumber=data.pageNumber;
this.dispatchEvent(paginationEvent);
]]>
</s:click>
</s:Button>
</s:GridItemRenderer>



</fx:Component>
</s:itemRenderer>
</s:DataGroup>


<s:Button label="下一页" click="nextPage();">

</s:Button>

</s:HGroup>



在这两个自定义组件上,都可以使用元数据标签
<fx:Metadata>
[Event(name="pageChanged", type="com.crap.event.PaginationEvent")]
</fx:Metadata>

这样在引用组件的时候,可以直接添加event handler

<crap:PaginationHalo id="pagination1" pageChanged="onPageChanged(event)"/>
<crap:PaginationSpark id="pagination2" pageChanged="onPageChanged(event)"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值