2011-08-02 5 views
2

itemRenderer 내부의 데이터 항목 인덱스를 가져 오는 직접적인 방법이 있습니까? 각 품목에 대해 품목 번호를 표시해야합니다. 현재 해결 방법을 수행하고 있으며 itemRenderer 구성 요소를 다시 사용할 수 없습니다.DisplayList ItemRenderer Flex3의 인덱스

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

이것은 현재 사용하고있는 것으로, 작동하지만 구성 요소 재사용 및 데이터 추상화의 개념이 손상되었습니다. 내가

답변

2

첫 번째 대답은 작동하지만, 속도가 느린 것 같습니다. 매번 항목 인덱스를 얻기 위해 dataProvider 배열을 통해 실행될 때 O (n^2) 시간이 필요합니다. listData에서 rowIndex에 액세스 할 수 있습니다. 이는 현재 표시된 항목의 인덱스를 나타냅니다. 부모 목록에서 수직 스크롤 위치는 스크롤 항목의 양을 나타냅니다 플렉스 3._를 사용하고

<?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> 
+0

내 목록 1000 개 항목에 가깝게 표시, 그래서 나는 것 지정 – midhunhk

+1

사실 'verticalScrollPosition'은 뷰에서 벗어난 픽셀의 수를 나타내지 만 List (DataGrids and Trees)에서는 이러한 항목의 수를 나타냅니다. 그것을 증가 시키거나 감소 시키십시오 - 목록은 픽셀이 아닌 항목별로 스크롤합니다. – moropus

+0

그건 시원한 관찰이었는데, 캔버스와 같은 모든 것을 픽셀 단위로 스크롤한다고 생각했습니다. 리스트 기반 아이템 들과는 다르다. 나는 명심할 것이다, 이것은 유용 할 수있다 :) – midhunhk

1

플렉스 3를 사용하고

당신은 당신의 문제를 해결하기 위해 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> 
+0

께요이 :) – midhunhk

-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> 
+1

_i을 확인을 플렉스 3 – Constantiner

+0

저자 내 프로젝트에서 이것을 사용하고 있습니다. 'verticalScrollPosition'은 보이지 않는 아이템 아이템의 수를 나타냅니다 (보이는리스트보다 위에)? –

관련 문제