滚动时网格项目渲染器混乱
Grid itemrenderer messup while scrolling
我有一个列表,其中数据网格为 itemRenderer
,例如:
<s:List id="cList" itemRenderer="views.renderers.DGridItemRenderer"
dataProvider="{sList}" useVirtualLayout="false"/>
ItemRenderer Datagrid 就像:
<s:DataGrid id="cDataGrid" width="100%" height="100%" editable="true" >
<s:columns>
<mx:ArrayList>
<mx:source>
<s:GridColumn width="40" headerText="Name" dataField="name" editable="false"/>
<s:GridColumn width="40" headerText="class" dataField="class" editable="false" />
<s:GridColumn width="60" headerText="age" dataField="age" editable="true"/>
<s:GridColumn width="60" headerText="SLight" editable="false" itemRenderer="views.renderers.SLColorStatusRenderer"/>
</mx:source>
</mx:ArrayList>
</s:columns>
</s:DataGrid>
现在 Slight
gridColumn 有以下 GridItemRenderer
有图标 :
<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" verticalCenter="0" clipAndEnableScrolling="true">
<fx:Script>
<![CDATA[
override public function prepare(hasBeenRecycled:Boolean):void {
if(data.age < 18 && data.age > 0)
{
imgStatus.source = ImageProvider.redIcon;
}
else if(data.age >= 18)
{
imgStatus.source = ImageProvider.greenIcon;
}
]]>
</fx:Script>
<s:Image id="imgStatus" width="21" height="21" buttonMode="true" horizontalCenter="0" verticalCenter="0" />
</s:GridItemRenderer>
SLight 列包含 Red/Green 图标取决于年龄数据。年龄值应该可以在数据网格中编辑。
如果年龄小于 18 岁,则图标为红色,否则为绿色。
现在,我的问题是当我滚动 datagid 时,图标会乱七八糟。图标将显示在任何记录中,无论是否有年龄。
第一次加载时所有图标看起来都不错。但是当我滚动时,只会弄乱图标并改变他们的位置。
我使用 useVirtualLayout="false"
作为列表,clipAndEnableScrolling="true"
作为 itemrenderer
,但我仍然无法解决它。
我找到了很多,但没有得到任何合适的解决方案。
编辑:
如果年龄小于 18 岁则为红色,如果年龄大于 18 岁则为绿色。否则,如果未定义年龄,则为空白。
我的问题是当我滚动时空白行也会显示图标。红色图标行将随机变为绿色和绿色变为红色。一团糟。
首先显示如下。 (正确):
当我滚动数据网格后,它变为以下。 (不正确)
你的问题是你没有正确处理 itemrenderer 回收,因为 age
并不总是设置。如果您的数据始终具有 age
值,您会没事的。事实上,您的代码没有办法清除 imgStatus
对象——如果 age
是 null
或 -1
,它只会保留已经存在的任何图标.
将您的代码更改为以下内容:
if(data.age < 18 && data.age > 0)
{
imgStatus.source = ImageProvider.redIcon;
imgStatus.visible = true;
}
else if(data.age >= 18)
{
imgStatus.source = ImageProvider.greenIcon;
imgStatus.visible = true;
}
else
{
//You could use the following line instead if you have a "clear icon" defined.
//imgStatus.source = ImageProvider.clearIcon;
imgStatus.visible = false;
}
我有一个列表,其中数据网格为 itemRenderer
,例如:
<s:List id="cList" itemRenderer="views.renderers.DGridItemRenderer"
dataProvider="{sList}" useVirtualLayout="false"/>
ItemRenderer Datagrid 就像:
<s:DataGrid id="cDataGrid" width="100%" height="100%" editable="true" >
<s:columns>
<mx:ArrayList>
<mx:source>
<s:GridColumn width="40" headerText="Name" dataField="name" editable="false"/>
<s:GridColumn width="40" headerText="class" dataField="class" editable="false" />
<s:GridColumn width="60" headerText="age" dataField="age" editable="true"/>
<s:GridColumn width="60" headerText="SLight" editable="false" itemRenderer="views.renderers.SLColorStatusRenderer"/>
</mx:source>
</mx:ArrayList>
</s:columns>
</s:DataGrid>
现在 Slight
gridColumn 有以下 GridItemRenderer
有图标 :
<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" verticalCenter="0" clipAndEnableScrolling="true">
<fx:Script>
<![CDATA[
override public function prepare(hasBeenRecycled:Boolean):void {
if(data.age < 18 && data.age > 0)
{
imgStatus.source = ImageProvider.redIcon;
}
else if(data.age >= 18)
{
imgStatus.source = ImageProvider.greenIcon;
}
]]>
</fx:Script>
<s:Image id="imgStatus" width="21" height="21" buttonMode="true" horizontalCenter="0" verticalCenter="0" />
</s:GridItemRenderer>
SLight 列包含 Red/Green 图标取决于年龄数据。年龄值应该可以在数据网格中编辑。
如果年龄小于 18 岁,则图标为红色,否则为绿色。
现在,我的问题是当我滚动 datagid 时,图标会乱七八糟。图标将显示在任何记录中,无论是否有年龄。
第一次加载时所有图标看起来都不错。但是当我滚动时,只会弄乱图标并改变他们的位置。
我使用 useVirtualLayout="false"
作为列表,clipAndEnableScrolling="true"
作为 itemrenderer
,但我仍然无法解决它。
我找到了很多,但没有得到任何合适的解决方案。
编辑:
如果年龄小于 18 岁则为红色,如果年龄大于 18 岁则为绿色。否则,如果未定义年龄,则为空白。
我的问题是当我滚动时空白行也会显示图标。红色图标行将随机变为绿色和绿色变为红色。一团糟。
首先显示如下。 (正确):
当我滚动数据网格后,它变为以下。 (不正确)
你的问题是你没有正确处理 itemrenderer 回收,因为 age
并不总是设置。如果您的数据始终具有 age
值,您会没事的。事实上,您的代码没有办法清除 imgStatus
对象——如果 age
是 null
或 -1
,它只会保留已经存在的任何图标.
将您的代码更改为以下内容:
if(data.age < 18 && data.age > 0)
{
imgStatus.source = ImageProvider.redIcon;
imgStatus.visible = true;
}
else if(data.age >= 18)
{
imgStatus.source = ImageProvider.greenIcon;
imgStatus.visible = true;
}
else
{
//You could use the following line instead if you have a "clear icon" defined.
//imgStatus.source = ImageProvider.clearIcon;
imgStatus.visible = false;
}