`
kabike
  • 浏览: 610785 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

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

    博客分类:
  • flex
阅读更多
基本各种列表都和分页有着密不可分的关系.
在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>

效果如图所示


我们在这里新定义了一个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)"/>
分享到:
评论

相关推荐

    Flex教程-王一松

    Flex基础与入门 - **Flex简介**:Flex是一种用于构建跨浏览器、跨平台的RIA(Rich Internet Applications)的开源框架。它结合了强大的编程语言ActionScript 3.0和XML,使得开发者能够轻松创建高性能的应用程序。 ...

    flexstore flex入门示例

    本示例将带你入门FlexStore的使用,通过一个名为"bookstore"的应用来展示其核心功能。 在Flex开发中,FlexStore通常与数据网格(DataGrid)或列表组件(List)结合使用,用于展示和操作数据。它是基于AMF(Action ...

    Flex-LCDS-Java.rar_LCDS_flex_flex java

    在“Flex + LCDS +JAVA入门教程”中,你可能会学习到以下内容: 1. **设置环境**:如何配置Flex Builder或者IntelliJ IDEA等IDE来开发Flex项目,以及如何在服务器上部署LCDS。 2. **创建Flex应用**:学习MXML和...

    Flex + LCDS + Java 入门教程

    4. **数据绑定和事件处理**:学习Flex中的数据绑定机制,如何将后台数据动态显示在界面上,以及如何处理用户交互事件,实现前后端的数据同步。 5. **实时数据推送**:探讨LCDS的事件驱动推送服务,如PollingDuplex...

    Flex 3 in Action

    ### Flex 3 in Action:全面掌握Flex 3与ActionScript技术要点 《Flex 3 in Action》是一本针对Adobe Flex 3平台的深入教程,它不仅涵盖了基础功能介绍,还提供了大量的实践案例来帮助读者更好地理解和应用这些知识...

    EXT-js-中文手册

    #### 4. Element:Ext的核心 - **核心概念**:Element是EXT中一个重要的概念,用于表示DOM元素。它是实现EXT各种功能的基础。 - **操作方法**:通过Element可以获取、修改DOM节点,执行动画效果,触发事件等。 ####...

    extjs入门文档

    ### ExtJS 入门文档知识点概述 #### 一、ExtJS 概述 ExtJS 是一款基于 JavaScript 的开源前端框架,主要用于构建复杂的企业级 Web 应用程序。它提供了丰富的 UI 组件库以及数据处理能力,能够帮助开发者快速构建...

    jpressuniapp傻瓜式教程手把手从0开始编写

    4.2 CSS响应式设计:利用uni-app的flex布局和媒体查询,实现不同设备上的适配,确保在手机、平板、电脑等多端展示效果一致。 五、功能实现与优化 5.1 文章列表:创建一个列表组件,通过调用jPress API获取文章列表...

    livedocs_blazeDS

    4. **最佳实践**:分享开发BlazeDS应用时的经验和技巧,避免常见的陷阱和错误。 5. **教程和示例**:提供一系列示例代码和步骤,帮助开发者快速掌握BlazeDS的使用。 通过深入学习和实践这个离线文档,开发者可以...

    racine:WordPress入门主题,包括核心主题功能

    另一个用于快速开发的 WordPress 入门主题,包括核心主题功能和基本模板文件。 它非常简约,模板文件中包含尽可能少的样式,并且 style.css 包含 Theme Check 测试所需的类(请参阅 )。 Racine 可以用作父主题,...

Global site tag (gtag.js) - Google Analytics