在Flex3中显示列表ItemRenderer索引

时间:2011-08-02 11:07:23

标签: flex actionscript-3 flex3 itemrenderer

有没有直接的方法来获取itemRenderer中数据的项索引?我需要针对每个项目显示项目编号。我目前正在做一个解决方法,不允许重复使用我的itemRenderer组件。

var index:int = model.dataColl.getItemIndex(data) + 1;
itemNo = index.toString();

这就是我现在使用的,它可以工作,但组件重用和数据抽象的概念受到了损害。

我正在使用Flex 3。

3 个答案:

答案 0 :(得分:2)

第一个答案似乎有效,但速度很慢。每次运行dataProvider数组以获取项索引需要O(n ^ 2)时间。 我们可以从listData访问rowIndex - 它表示当前可见项的索引。父列表中的垂直滚动位置表示滚动项的数量:

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" implements="mx.controls.listClasses.IDropInListItemRenderer">
<mx:Script>
    <![CDATA[
        import mx.controls.listClasses.BaseListData;
        import mx.controls.listClasses.ListBase;

        [Bindable] private var index:int = 0;

        private var _listData:BaseListData;
        public function get listData():BaseListData
        {
            return _listData;
        }
        public function set listData(value:BaseListData):void
        {
            _listData = value;
        }

        override public function set data(value:Object):void
        {
            super.data = value;
            if (data && listData)
                index = _listData.rowIndex + ListBase(_listData.owner).verticalScrollPosition;
            else
                index = 0;
        }
    ]]>
</mx:Script>
<mx:Label text="{index}"/>
<mx:Label text="{data.toString()}"/>
</mx:HBox>

答案 1 :(得分:1)

您可以使用labelFunction来解决问题。对于简单的测试应用程序:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application creationComplete="init()" layout="absolute" xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        private static const DATA_LENGTH:Number = 100;

        [Bindable]
        private var dp:ArrayCollection;

        private function countFinction(item:Object):String
        {
            return (dp.getItemIndex(item) + 1).toString();
        }

        private function init():void
        {
            var dataArray:Array = [];
            for (var i:int = 0; i < DATA_LENGTH; i++)
            {
                var item:Object = { firstName: "First" + (i + 1), lastName: "Last" + (i + 1) };
                dataArray.push(item);
            }
            dp = new ArrayCollection(dataArray);
        }
    ]]>
    </mx:Script>
    <mx:List dataProvider="{dp}" height="500" horizontalCenter="0" itemRenderer="TestRenderer"
        labelFunction="countFinction" verticalCenter="0" width="500" />
</mx:Application>

您可以使用以下测试渲染器:

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox implements="mx.controls.listClasses.IDropInListItemRenderer" xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
    <![CDATA[
        import mx.controls.listClasses.BaseListData;

        private var _listData:BaseListData;

        /**
         * @inheritDoc
         */
        public function get listData():BaseListData
        {
            return _listData;
        }

        [Bindable(event = "listDataChanged")]
        /**
         * @inheritDoc
         */
        public function set listData(value:BaseListData):void
        {
            if (value == _listData)
                return;
            _listData = value;
            dispatchEvent(new Event("listDataChanged"));
        }
    ]]>
    </mx:Script>
    <mx:Label fontWeight="bold" text="{listData.label}" />
    <mx:Label text="{data.firstName + ' ' + data.lastName}" />
</mx:HBox>

答案 2 :(得分:-1)

项目渲染器上有一个项目索引属性。

this.itemIndex

样品:

<s:List>
        <s:dataProvider>
            <s:ArrayList>
                <fx:String>Item 1</fx:String>
                <fx:String>Item 2</fx:String>
                <fx:String>Item 3</fx:String>
                <fx:String>Item 4</fx:String>
                <fx:String>Item 5</fx:String>
                <fx:String>Item 6</fx:String>
            </s:ArrayList>
        </s:dataProvider>
        <s:itemRenderer>
            <fx:Component>
                <s:ItemRenderer>
                    <s:HGroup>
                        <s:Label text="This index is: {this.itemIndex}" />
                        <s:Label text="{data}" />
                    </s:HGroup>
                </s:ItemRenderer>
            </fx:Component>
        </s:itemRenderer>
    </s:List>