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にアクセスできます。これは、現在表示されている項目のインデックスを表します。親リストからの垂直スクロール位置スクロールアイテムの量を表します。

<?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件近くに表示するので、私なりに使用しています私のプロジェクトでこれを使用しています。 'verticalScrollPosition'は、表示されていないアイテム(可視リストの上)のアイテムの数を示していますか? – midhunhk

+1

実際には 'verticalScrollPosition'はビューから外れているピクセルの数を示しますが、List(DataGridsとTrees)ではそのような項目の数を示します。インクリメントまたはデクリメントしてください。リストはピクセル単位ではなく項目単位でスクロールします。 – moropus

+0

これはすばらしい所見ですが、私はいつもCanvasのようにピクセルでスクロールすると思っていました。 Listベースのアイテムとは異なります。私は心に留めておきます、これは便利です:) – midhunhk

1

のFlex 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は、Flex 3._ – Constantiner

+0

著者は、Flex 3 –

関連する問題