项目中遇到这样一个问题: 在datagrid中加itemrender,itemrender中是个checkbox,checkbox根据当前行的数据决定是否选中它, 当设置datagrid的高度不能完全显示列表中数据时,滚动列表时checkbox有时选中有时不选中,且有时会选到其它行上:
问题分析:
假设您要显示 1,000 条记录。如果您认为列表控制会创建 1,000 个 itemRenderer, 您就错了。如果列表只显示 10 行, 它会创建约 12 个 itemRenderer-这些足以显示各个可见行, 多出的几个则用于缓冲和性能。列表最初显示行 1–10。当用户滚动这个列表时, 它现在可能显示行 3-12。但那 12 个 itemRenderer 仍在那里: 及时滚动列表后, 也不会新建任何 itemRenderer。
以下是 Flex 执行的操作。滚动列表时, 那些依然显示相同数据 (行 3-10) 的 itemRenderer 将向上移动。它们并未发生任何变化, 只是移到了新位置。之前显示行 1 和 行 2 数据的 itemRenderer 现在移到行 10 的 itemRendere 下。然后, 为那些 itemRenderer 提供行 11 和 行 12 的数据。换言之, 除非您调整列表大小, 否则将重用/循环使用那些相同的 itemRenderer-它们只是移到新位置并且现在显示新数据。
解决办法:1.设置datagrid高度可显示全部数据 ,即不会出现滚动条 ;
2.推荐方法 复写set data(value :Object):void方法,将要处理的过程放到此方法中
如:
<?xml version="1.0" encoding="utf-8"?> <s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" focusEnabled="true"> <fx:Script> <!--[CDATA[ import mx.controls.Alert; import mx.events.FlexEvent; override public function set data( value:Object) : void { super.data = value; var len :int = ModelLocator.ds.length; var isInselected :Boolean = false; for(var i :int = 0 ; i<len ; i++){ if(ModelLocator.ds[i].name == data.name){ isInselected= true; ModelLocator.selectedsd.put(data.name,data.name); } } ck.selected = isInselected; } protected function ck_clickHandler(event:MouseEvent):void { if(ck.selected){ ModelLocator.selectedsd.put(data.name,data.name); }else{ ModelLocator.selectedsd.remove(data.name); } } ]]--> </fx:Script> <s:CheckBox id="ck" label="{data.age}" click="ck_clickHandler(event)"> </s:CheckBox> </s:MXDataGridItemRenderer>
注意;复写此方法必须调用父类set data方法 super.data = value; 不然数据会出错
参看:http://www.adobe.com/cn/devnet/flex/articles/itemrenderers_pt1.html