我在 DataGrid 和多个项目渲染器以及滚动时重用项目渲染器时遇到了类似的问题。为了访问 DataGrid 项目渲染器,我扩展了 DataGrid。我的第一个想法是使用 indicesToIndex(),然后是 indexToItemRenderer()。不幸的是,这些方法没有达到我的预期,所以我添加了 indicesToItemRenderer() 方法:
包 com.whatever.controls {
import mx.controls.DataGrid;
import mx.controls.listClasses.IListItemRenderer;
public class CustomDataGrid extends DataGrid
{
public function CustomDataGrid()
{
super();
}
public function indicesToItemRenderer(rowIndex:int, colIndex:int):IListItemRenderer
{
var firstItemIndex:int = verticalScrollPosition - offscreenExtraRowsTop;
if (rowIndex < firstItemIndex ||
rowIndex >= firstItemIndex + listItems.length
)
{
return null;
}
return listItems[rowIndex - firstItemIndex][colIndex];
}
}
要解决滚动时重复使用的项目渲染器问题,请参阅这篇文章:
http://www.adobe.com/devnet/flex/articles/itemrenderers_pt1.html
它归结为覆盖数据设置器并将属性存储在数据中。例如,我有一列使用 CheckBox itemRenderer,另一列使用 ComboBox。对于这两者,我都会监听更改事件,并在属性更改时将 selected、selectedIndex 等存储在数据中,并覆盖数据设置器以设置这些属性:
override public function set data(value:Object):void
{
if (value != null)
{
super.data = value;
if (data.hasOwnProperty('selected') && data.selected)
{
selected = data.selected;
}
else
{
selected = false;
}
}
}