首页 > 网站 > WEB开发 > 正文

7.13.改变List 中渲染器的大小

2024-04-27 13:52:02
字体:
来源:转载
供稿:网友
7.13.1. 问题
你需要创建一个被选中时是可以改变大小的renderer。
7.13.2. 解决办法
创建一个drop-in itemRenderer,实现IDropInListItemRenderer 接口,并且通过listData 监听List 的Scroll 和Change 事件,当这两个事件中的任意一个事件发生时,比较itemRenderer 中的data 与List 中selectedItem 中的data,如果相等,就设置currentState 为selected,否则设置为base。
7.13.3. 讨论
有一点很重要:itemRenderer 是被list 重用的。当一个renderer 被选中,在你试图设置它的state 的时候,要在每个renderer 里判断自己是不是那个被选中的renderer,这个itemRenderer 的data 必须和List 或DataGridColumn 的选中项的data 相配置,而不是靠seletedIndex 确定。

因为你可以通过listData 访问List 和DataGridColumn,所以你为可以通过listData对listData 或
+展开
-ActionScript
DataGridColumn 增加事件的监听,并且在事件发生时,可以检查renderer的data 和state:
private function resizeEventHandler(event:Event):void {
if ((_listData.owner as List).selectedIndex == ArrayCollection(
(_listData.owner as List).dataProvider).getItemIndex(this.data) &¤tState ! "selected") {
trace("functions"+_listData.rowIndex+" "+(_listData.owner asList).selectedIndex);
currentState = "selected";
else if((_listData.owner as List).selectedIndex !=ArrayCollection((_listData.owner as List).dataProvider).getItemIndex(this.data) &¤tState == "selected") {
currentState = "base";
}
}

下面的代码中假定dataProvider 的数据类型为ArrayCollection,当然我们也可以把代码写的更公用一些,但在一般情况下,ArrayCollection 就足够了。
+展开
-XML
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxmlheight="30"
currentState="baseimplements="mx.controls.listClasses.IDropInListItemRenderer"
verticalScrollPolicy="off">

<mx:Script>
<![CDATA[
import mx.controls.List;
import mx.events.ListEvent;
import mx.controls.listClasses.BaseListData;
import mx.collections.ArrayCollection;
private function resizeFocusInHandler(event:Event):void {
if ((_listData.owner as List).selectedIndex == ArrayCollection((_listData.owner as List).dataProvider).getItemIndex(this.data)&& currentState != "selected") {
trace("functions"+_listData.rowIndex+" "+(_listData.owner as List).selectedIndex);
currentState = "selected";
else if ((_listData.owner as List).selectedIndex != ArrayCollection((_listData.owner as
List).dataProvider).getItemIndex(this.data)&& currentState == "selected") {
currentState = "base";
}
}
override public function set data(value:Object):void { txt.text = value as String; }
override public function get data():Object { return txt.text; }
// Internal variable for the property value.
private var _listData:BaseListData;
// Make the listData property bindable.
[Bindable("dataChange")]
// Define the getter method.
public function get listData():BaseListData { return _listData; }
// set the event listeners for the Change and Scroll events
// that the List or Column will dispatch
public function set listData(value:BaseListData):void {
_listData = value;
_listData.owner.addEventListener(ListEvent.CHANGE, resizeFocusInHandler);
_listData.owner.addEventListener(Event.SCROLL, resizeFocusInHandler);
}

]]>
</mx:Script>
<mx:transitions>
<mx:Transition fromState="*toState="selected">
<mx:Resize heightTo="60target="{this
}
"/>

</mx:Transition>
<mx:Transition fromState="selectedtoState="*">
<mx:Resize heightTo="30target="{this }"/>
</mx:Transition>
</mx:transitions>
<mx:states>
<mx:State name="base"/>
<mx:State name="selected">
<mx:AddChild>
<mx:HBox>
<mx:Label text="some text"/>
<mx:Label text="{'some text = ' +txt.text}"/>
</mx:HBox>
</mx:AddChild>
</mx:State>
</mx:states>
<mx:Text id="txt"/>
</mx:VBox>
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表