Flex 如何得到itemRenderer里面的內(nèi)容
更新時(shí)間:2009年07月13日 00:26:42 作者:
itemRenderer里面的內(nèi)容 獲取技巧。
前幾天在寫ViSR的時(shí)候,碰到了一個(gè)問(wèn)題,問(wèn)題如下:
1、定義了一個(gè)HorizontalList類型的可視化組件:MyHorizontalList。
2、MyHorizontalList的屬性:dataProvider。它綁定了一個(gè)外部數(shù)據(jù)。(假設(shè)這個(gè)外部數(shù)據(jù)共6條)
3、MyHorizontalList的屬性:itemRenderer,它使用了自定義的組件:MyItemRenderer
4、在MyItemRenderer里面定義了一個(gè)public類型的functon:refresh()
5、程序初始化的時(shí)候,眾所周知如果要對(duì)MyItemRenderer里面的item進(jìn)行賦值的話,要使用data.XXX的形式,同時(shí)應(yīng)該有6個(gè)MyItemRenderer被建立起來(lái),同時(shí)它們都被HorizontalList的渲染器itemRenderer呈現(xiàn)了出來(lái)。
以上的情況一切都很順利,順心是不是呢:)
問(wèn)題出現(xiàn)了:當(dāng)Flex App運(yùn)行后,我要?jiǎng)討B(tài)的調(diào)用MyHorizontalList包含的MyItemRenderer里面的public funciton:refresh(),即對(duì)全部的MyItemRenderer里面的refresh都需要調(diào)用。而這個(gè)調(diào)用并不需要使用使用任何的event(例如itemClick這個(gè)event)。
探索方式:
1、遍歷MyHorizontalList里面的child,發(fā)現(xiàn)只有三個(gè)。
2、自動(dòng)遍歷觸發(fā)itemClick event,可以實(shí)現(xiàn),但是效率是一個(gè)問(wèn)題(做大型的Flex App時(shí),一定要注意效率這個(gè)問(wèn)題。)
無(wú)奈下只能去HorizontalList.as里面搜尋答疑,結(jié)果終于讓我結(jié)合Adobe Doc發(fā)現(xiàn)了這個(gè)問(wèn)題的解決方法。
這是尋找的思路:
HorizontalList是繼承與ListBase,而ListBase屬于mx.controls.listClasses包下面的class,因此最有希望的是在mx.controls.listClasses這個(gè)下面
實(shí)現(xiàn)方法:
1、在探索階段使用第一種方式的時(shí)候,會(huì)得到MyHorizontalList共有三個(gè)child,而我們就需要它的最后一個(gè)child。
即:MyHorizontalList.getChildAt( 2 )
2、請(qǐng)大家一定要注意:它最后一個(gè)child是一個(gè)ListBaseContentHolder類型的變量,而ListBaseContentHolder是存在于mx.controls.listClasses.ListBaseContentHolder里面的。
因此我們需要手動(dòng)引入如下的class:
import mx.controls.listClasses.ListBaseContentHolder;
var myHList : ListBaseContentHolder = MyHorizontalList.getChildAt( 2 ) as ListBaseContentHolder;
通過(guò)上面的代碼就得到了myHList。(注意它的類型是:ListBaseContentHolder )
3、ListBaseContentHolder里面有一個(gè)public method:listItems,它的定義如下:
原文:An Array of Arrays that contains the item renderer instances that render each data provider item.
翻譯:一個(gè)由數(shù)組組成的 Array,其中包含用于顯示dataProvider提供的項(xiàng)目渲染器實(shí)例。
通過(guò)上面的翻譯不難看出,listItems就是我們要使用的method,即包含了MyItemRenderer的數(shù)組。
4、以下是的source就比較簡(jiǎn)單了:
//得到MyRendererArr
var MyRendererArr : Array = listBase.listItems[ 0 ] as Array ;
//遍歷MyRendererArr
for ( var i : int = 0; i < MyRendererArr .length; i ++ ) {
//每一個(gè)MyRendererArr[ i ]都是一個(gè)實(shí)例的MyItemRenderer
var temp : MyItemRenderer= MyRendererArr [ i ] as MyItemRenderer;
//即我想要的最終結(jié)果
temp.refresh();
}
是不是很簡(jiǎn)單,其實(shí)上面的方式適用于任何繼承與ListBase的組件。
關(guān)于ListBase的介紹:
它是所有提供項(xiàng)目列表的基類,即它是itemRenderer的基類。
1、定義了一個(gè)HorizontalList類型的可視化組件:MyHorizontalList。
2、MyHorizontalList的屬性:dataProvider。它綁定了一個(gè)外部數(shù)據(jù)。(假設(shè)這個(gè)外部數(shù)據(jù)共6條)
3、MyHorizontalList的屬性:itemRenderer,它使用了自定義的組件:MyItemRenderer
4、在MyItemRenderer里面定義了一個(gè)public類型的functon:refresh()
5、程序初始化的時(shí)候,眾所周知如果要對(duì)MyItemRenderer里面的item進(jìn)行賦值的話,要使用data.XXX的形式,同時(shí)應(yīng)該有6個(gè)MyItemRenderer被建立起來(lái),同時(shí)它們都被HorizontalList的渲染器itemRenderer呈現(xiàn)了出來(lái)。
以上的情況一切都很順利,順心是不是呢:)
問(wèn)題出現(xiàn)了:當(dāng)Flex App運(yùn)行后,我要?jiǎng)討B(tài)的調(diào)用MyHorizontalList包含的MyItemRenderer里面的public funciton:refresh(),即對(duì)全部的MyItemRenderer里面的refresh都需要調(diào)用。而這個(gè)調(diào)用并不需要使用使用任何的event(例如itemClick這個(gè)event)。
探索方式:
1、遍歷MyHorizontalList里面的child,發(fā)現(xiàn)只有三個(gè)。
2、自動(dòng)遍歷觸發(fā)itemClick event,可以實(shí)現(xiàn),但是效率是一個(gè)問(wèn)題(做大型的Flex App時(shí),一定要注意效率這個(gè)問(wèn)題。)
無(wú)奈下只能去HorizontalList.as里面搜尋答疑,結(jié)果終于讓我結(jié)合Adobe Doc發(fā)現(xiàn)了這個(gè)問(wèn)題的解決方法。
這是尋找的思路:
HorizontalList是繼承與ListBase,而ListBase屬于mx.controls.listClasses包下面的class,因此最有希望的是在mx.controls.listClasses這個(gè)下面
實(shí)現(xiàn)方法:
1、在探索階段使用第一種方式的時(shí)候,會(huì)得到MyHorizontalList共有三個(gè)child,而我們就需要它的最后一個(gè)child。
即:MyHorizontalList.getChildAt( 2 )
2、請(qǐng)大家一定要注意:它最后一個(gè)child是一個(gè)ListBaseContentHolder類型的變量,而ListBaseContentHolder是存在于mx.controls.listClasses.ListBaseContentHolder里面的。
因此我們需要手動(dòng)引入如下的class:
import mx.controls.listClasses.ListBaseContentHolder;
var myHList : ListBaseContentHolder = MyHorizontalList.getChildAt( 2 ) as ListBaseContentHolder;
通過(guò)上面的代碼就得到了myHList。(注意它的類型是:ListBaseContentHolder )
3、ListBaseContentHolder里面有一個(gè)public method:listItems,它的定義如下:
原文:An Array of Arrays that contains the item renderer instances that render each data provider item.
翻譯:一個(gè)由數(shù)組組成的 Array,其中包含用于顯示dataProvider提供的項(xiàng)目渲染器實(shí)例。
通過(guò)上面的翻譯不難看出,listItems就是我們要使用的method,即包含了MyItemRenderer的數(shù)組。
4、以下是的source就比較簡(jiǎn)單了:
//得到MyRendererArr
var MyRendererArr : Array = listBase.listItems[ 0 ] as Array ;
//遍歷MyRendererArr
for ( var i : int = 0; i < MyRendererArr .length; i ++ ) {
//每一個(gè)MyRendererArr[ i ]都是一個(gè)實(shí)例的MyItemRenderer
var temp : MyItemRenderer= MyRendererArr [ i ] as MyItemRenderer;
//即我想要的最終結(jié)果
temp.refresh();
}
是不是很簡(jiǎn)單,其實(shí)上面的方式適用于任何繼承與ListBase的組件。
關(guān)于ListBase的介紹:
它是所有提供項(xiàng)目列表的基類,即它是itemRenderer的基類。
相關(guān)文章
Flex 非常實(shí)用的學(xué)習(xí)資料整理
對(duì)于學(xué)習(xí)flex 的朋友,絕對(duì)是個(gè)不錯(cuò)的一些資料,大家可以用ctrl+F搜索獲取2009-01-01Flex 全屏組件 部分全屏的實(shí)現(xiàn)代碼
一般情況下,F(xiàn)lex全屏是指將整個(gè)舞臺(tái)全屏,而不是待定的組件全屏.網(wǎng)上的例子也一般是指這種情況的.2009-09-09在flex中執(zhí)行一個(gè)javascript方法的簡(jiǎn)單方式
說(shuō)明:這里巧妙的運(yùn)用了JavaScript中的eval全局函數(shù),非常好,省的在嵌入flash的網(wǎng)頁(yè)文件中寫JavaScript函數(shù)。2009-05-05Flex與.NET互操作 使用FileReference+HttpHandler實(shí)現(xiàn)文件上傳/下載
Flex與.NET互操作 使用FileReference+HttpHandler實(shí)現(xiàn)文件上傳/下載2009-06-06Flex中讓鼠標(biāo)移至AdvancedDataGrid的行上不自動(dòng)修改顯示效果
公司項(xiàng)目中出于性能考慮,把mx:Repeater控件換成了mx:AdvancedDataGrid控件來(lái)顯示。2009-05-05