1

这是问题所在:我有一些 dataProvider 和 itemRendererFunction 的列表。我不得不决定使用 itemRenderFunction,因为我们需要为 dataProvider 中的不同项目使用不同的渲染器。问题是当dataProvider中的单个项目发生变化时,我必须刷新整个dataProvider,这在数据量很大的情况下是很成问题的。在这种情况下有没有办法刷新单个项目?

示例代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application name="list_test"
               xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               click="onApplicationClick(event)"
               >

    <fx:Script>
        <![CDATA[
            import mx.core.ClassFactory;

            import renderers.*;

            import spark.skins.spark.DefaultItemRenderer;

            private function itemRendererFunction(item:Object):ClassFactory
            {
                var rendererClass:Class = DefaultItemRenderer;
                switch (item.type)
                {
                    case "typeA":
                        rendererClass = ItemRendererTypeA;
                        break;
                    case "typeB":
                        rendererClass = ItemRendererTypeB;
                        break;
                    default:
                        break;
                }
                return new ClassFactory(rendererClass);
            }

            protected function onApplicationClick(event:MouseEvent):void
            {
                var item:Object = dp.getItemAt(0);
                item.type = "typeB";
                dp.itemUpdated(item);
                dp.refresh();
            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <s:ArrayCollection id="dp">
            <fx:Object name="Item 1"
                       type="typeA"
                       />
            <fx:Object name="Item 2"
                       type="typeA"
                       />
            <fx:Object name="Item 3"
                       type="typeB"
                       />
        </s:ArrayCollection>
    </fx:Declarations>
            <s:List id="list"
                    labelField="name"
                    itemRendererFunction="itemRendererFunction"
                    horizontalCenter="0"
                    verticalCenter="0"
                    useVirtualLayout="true"
                    height="300"
                    dataProvider="{dp}"
                    >
            </s:List>
</s:Application>

我在项目渲染器类中的 addToStage 事件处理程序上放置了一些跟踪。每次单击都会调用它们。

4

1 回答 1

2

正如此 SO 帖子中所讨论的,您将希望避免为每次调用 itemRendererFunction 返回 ClassFactory 的新实例:

    private var itemRendererTypeA:ClassFactory = new ClassFactory(ItemRendererTypeA);
    private var itemRendererTypeB:ClassFactory = new ClassFactory(ItemRendererTypeB);

    private function itemRendererFunction(item:Object):ClassFactory
    {
        switch (item.type)
        {
            case "typeA":
                return itemRendererTypeA;
                break;
            case "typeB":
                return itemRendererTypeB;
                break;
            default:
                break;
        }
    }
于 2013-11-14T17:05:07.233 回答