2

我有一个填充了超过 1000 个数据集的网格。一列使用自定义 itemRenderer,用于显示外键的值。

所有未滚动显示的数据集都显示正确的信息。但是当涉及到滚动时,一些数据集会在 itemRenderer 中显示错误的值。据我了解,这是因为itemRenderers的重用。

但是,尽管重用可能很好,但结果不会是显示错误的信息。那么我该如何摆脱这个问题呢?

编辑:我已经设法摆脱了这个问题,但无论如何我都会发布一些代码来指出我的计划:

<?xml version="1.0" encoding="utf-8"?>

<mx:Script>
    <![CDATA[
        private var dataAccess : DataAccess = DataAccess.getInstance();
        private var foreign : ArrayCollection = new ArrayCollection();

        private function onCreationComplete() : void
        {

            dataAccess.service.getForeignDatasets.addEventListener("result", onGetForeignDatasets);
            dataAccess.service.getForeignDatasets();
        }

        private function onGetForeignDatasets(event : ResultEvent) : void
        {
            foreign = event.result as ArrayCollection;  
            preSelect();
        }   

        //gets the entry from the foreign entity which matches 
        //the foreign key in this.data
        private function preSelect() : void
        {
            for each(var obj : Object in foreign)
                {
                    if(obj.id == data.foreignKey))
                    {
                        value.text = obj.name;
                        return;
                    }
                }

            value.text = "";    
        }

        private function onDataChange() : void
        {
            preSelect();
        }       
    ]]>
</mx:Script>

我留下了所有不必要的代码......

上面的代码有效并解决了显示错误数据的问题。

实现此功能的任何其他想法?

4

3 回答 3

0

使用 DataGrid 控件的自定义 ItemRenderer 时,我也遇到了这种问题。一切都很好,但是当我滚动 DataGrid 时,我的 ItemRenderers 没有显示正确的值。我花了很多时间才明白发生了什么。原因在于 IremRenderers 的工作方式。请记住 itemRenderers 是可回收的。请阅读一篇关于 Item Renderers 的非常好的文章

简而言之,您必须为 ItemRenderer 设置数据,而不是在构造函数或 CreationComplete 事件中,而是在其他函数中。

对于 MX DataGrid- 您必须覆盖公共函数集数据,如下所示:

override public function set data( value:Object ) : void 
{ 
    super.data = value; 
    // your code to set your data 
}

对于 Spark DataGrid,您必须在

override public function prepare (hasBeenRecycled)

希望它可以提供帮助。

于 2012-04-24T15:38:59.870 回答
0

如果您的项目渲染器将信息缓存在私有变量(或其他任何地方)中,就会发生这种情况。项目渲染通过“数据”属性获取它的数据。它不应该使用任何不在“数据”属性中的数据。如果您绝对必须到外部获取其他数据(您确实不应该这样做),那么请确保在数据属性更改时使该数据无效(覆盖数据以标记更改的标志,然后调用 super.data)。

如果这不能解决您的问题,请发布您的项目渲染器代码。

于 2010-01-26T01:57:49.407 回答
0

useVirtualLayout="false"- 禁止 itemRenderers 重复使用。这是 List 基础组件布局的属性。

请参阅http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/layouts/supportClasses/LayoutBase.html#useVirtualLayout

于 2012-12-05T22:47:36.680 回答