微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

选中时,Itemrenderer崩溃

如何解决选中时,Itemrenderer崩溃

| 拥有带有简单自定义mxadvanceddatagriditemrenderer的高级数据网格。我希望渲染器仅在悬停或选中该行时才显示图像。现在,我通过在图像上使用excludeFrom = \“ normal \”标记来做到这一点。 当我将状态悬停并定义为普通状态时,它工作正常(减去选定状态,选定后消失)。当我尝试定义选定状态时,在单击行时出现以下错误
RangeError: Index 0 is out of range.
    at spark.components::Group/checkForRangeError()[E:\\dev\\4.x\\frameworks\\projects\\spark\\src\\spark\\components\\Group.as:1106]
    at spark.components::Group/setElementIndex()[E:\\dev\\4.x\\frameworks\\projects\\spark\\src\\spark\\components\\Group.as:1265]
    at spark.components::Group/addElementAt()[E:\\dev\\4.x\\frameworks\\projects\\spark\\src\\spark\\components\\Group.as:1167]
    at mx.states::AddItems/addItemsToContentHolder()[E:\\dev\\4.x\\frameworks\\projects\\framework\\src\\mx\\states\\AddItems.as:737]
    at mx.states::AddItems/apply()[E:\\dev\\4.x\\frameworks\\projects\\framework\\src\\mx\\states\\AddItems.as:545]
[E:\\dev\\4.x\\frameworks\\projects\\framework\\src\\mx\\core\\UIComponent.as:9961] ... etc
有没有人曾经经历过或知道解决方案? 谢谢 编辑:涉及的代码非常简单:
<s:MXAdvancedDataGridItemRenderer 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=\"false\">
<fx:Script>
<![CDATA[
import mx.collections.IList;
protected function removeRow(event:MouseEvent):void
{
var ind :int = IList(parentDocument.dataGrid.dataProvider).getItemIndex(data);
IList(parentDocument.dataGrid.dataProvider).removeItemAt(ind);
}   
]]>
</fx:Script>
<s:states>
<s:State name=\"normal\" />
<s:State name=\"hovered\"/>
<s:State name=\"selected\"/>
</s:states>
<mx:Image id=\"removeButton\" excludeFrom=\"normal\" source=\"@Embed(source=\'../assets/icons/close_icon.gif\')\" click=\"removeRow(event)\" width=\"10\" height=\"10\" alpha=\".5\" toolTip=\"{resourceManager.getString(\'localization\',\'REMOVE\')}\"/>
</s:MXAdvancedDataGridItemRenderer>
    

解决方法

        看起来-尽管有点奇怪,但您正在尝试同时更改itemrenderer的状态(通过单击将其更改为“ selected \”)时要删除它。 这是针对您要通过单击删除项目渲染器的情况的我的解决方案:只需让它调度冒泡的“删除”事件,然后让某种控制器处理该删除。 因此,您的itemrender可能如下所示:
<s:ItemRenderer xmlns:fx=\"http://ns.adobe.com/mxml/2009\" 
                xmlns:s=\"library://ns.adobe.com/flex/spark\">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
        ]]>
    </fx:Script>

    <s:states>
        <s:State name=\"normal\" />
        <s:State name=\"hovered\" />
        <s:State name=\"selected\" />
    </s:states>

    <!-- some other stuff -->

    <s:Button label=\"remove me\" excludeFrom=\"normal\"
              click=\"dispatchEvent(new FlexEvent(FlexEvent.REMOVE,true))\" />

</s:ItemRenderer>
此处的'true \'值很重要,它可以使事件一直泡到List组件。 然后,在具有对List(或DataGrid)的引用的控制器中,或者在List(或DataGrid)的子类中的引用中,捕获该事件并删除该项目。
theList.addEventListener(FlexEvent.REMOVE,handleRemoveRequest);

private function handleRemoveRequest(event:FlexEvent):void {
    var itemRender:IItemRenderer = event.target as IITemrenderer;
    var item:SomeClass = itemRender.data;
    var index:int = theDataProvider.getItemIndex(item);
    theDataProvider.removeItemAt(index);
}
在这里重要的是使用target而不是currentTarget,因为前者将是ItemRenderer,而后者将是List本身。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。