DataGrid と複数のアイテム レンダラー、およびスクロール時のアイテム レンダラーの再利用で同様の問題に遭遇しました。DataGrid アイテム レンダラーにアクセスするために、DataGrid を拡張しました。私が最初に考えたのは、indexToIndex() に続いて indexToItemRenderer() を使用することでした。残念ながら、これらのメソッドは期待どおりに動作しなかったため、indexesToItemRenderer() メソッドを追加しました。
パッケージ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;
}
}
}