私も同じことをしました。私が見つけたものから-GroupingCollection(2)および/またはSummaryRowを使用すると、実際に速度が低下します。言うまでもなく、特定のノードで新しいデータをフェッチすると、ツリー全体の開閉がリセットされます。
スモークテストのパフォーマンスから、約2000行をプル/ペイントするのに約5秒かかります。現在、各ノードの100〜200行で約1/2秒以下かかります(最初にADGを画面に呼び出したときの最初のペイントラグはカウントされません)。
私のために、私は次のことをしました:
HierarchicalData
dbから毎回フェッチするサマリーデータに基づいて子ノードが存在するタイミングをカスタマイズし、表示する子が含まれるプロパティを指定するように拡張します(childrenプロパティと異なる場合)-これは、で使用するモデルのためです。 RobotLegsMVCプラットフォーム。
- を拡張し
AdvancedDataGridGroupItemRenderer
て、開示アイコン(三角形のグラフィック)の色を視覚的に変更します。これにより、フェッチする必要のある要素と、すでにデータが存在するノードをユーザーに知らせることができます。これをgroupItemRendererプロパティに割り当てます。
- リスナーを使用
AdvancedDataGridEvent.ITEM_OPEN
してevent.itemプロパティを含むイベントをディスパッチし、コマンド>サービス>レスポンダーがUIによって要求された正確なノードでモデルを更新するようにします(子プロパティに追加します)。
CollectionChangeEvent
最上位のコレクションに適切なものを追加します(子はArrayCollectionsです-ネストされたコレクションはバインドされていません)
- レスポンダーが完了を宣言した後、dataproviderrefreshメソッドを呼び出します。
以下の疑似例:
//Listener on Grid:
protected function onLedgerOpenSummaryNode(event:AdvancedDataGridEvent):void
{
trace('LedgerMediator.onLedgerOpenSummaryNode', event.item);
if (event.item is SummaryTransaction)
{
refreshed = false;
sumTrans = event.item as SummaryTransaction;
//note - in my service responder I add the resulting db rows to the event.item
dispatch(new AccountEvent(AccountEvent.SUMMARY_DETAIL, null, account, event.item as SummaryTransaction));
}
}
//Dataprovider assignment to grid
private function get dataProvider():HierarchicalCollectionView
{
if (!groupCollection)
{
groupCollection = new HierarchicalCollectionView();
groupCollection.source = new OnDemandCollection();
}
return groupCollection;
}
//assigns the initial source to the demand collection
private function loadTransactions():void
{
var odc:OnDemandCollection = OnDemandCollection(dataProvider.source);
odc.source = account.summaryTransactions.children;
transactionChangeDetection(true);
view.callLater(deferrDataProviderUpdate);
}
//called when the service.responder dispatches it's 'complete event'.
private function deferrDataProviderUpdate():void
{
if (refreshed) return;
dataProvider.refresh();
}
//add change event listener to the top-level collection
private function transactionChangeDetection(add:Boolean):void
{
var collection:ArrayCollection;
//nested collections are not binding up the object chain, so change listeners must be added/removed to/from each collection.
for each ( var summary:SummaryTransaction in account.summaryTransactions.collection)
{
collection = summary.transactions.collection;
add ? collection.addEventListener(CollectionEvent.COLLECTION_CHANGE, onTransactionUpdate)
: collection.removeEventListener(CollectionEvent.COLLECTION_CHANGE, onTransactionUpdate);
}
}
//block the refresh method - only interested in add,delete,update
protected function onTransactionUpdate(event:CollectionEvent):void
{
if (event.kind == CollectionEventKind.REFRESH) return;
view.callLater(deferrDataProviderUpdate);
}
public class ExtAdvancedDataGridGroupItemRenderer extends AdvancedDataGridGroupItemRenderer
{
private var defaultColor:ColorTransform;
public function ExtAdvancedDataGridGroupItemRenderer()
{
super();
}
override protected function commitProperties():void
{
super.commitProperties();
if (disclosureIcon) defaultColor = disclosureIcon.transform.colorTransform;
}
override protected function updateDisplayList(w:Number, h:Number):void
{
super.updateDisplayList(w, h);
if (!listData || !data) return;
var adgld:AdvancedDataGridListData = AdvancedDataGridListData(listData);
var adg:AdvancedDataGrid = adgld.owner as AdvancedDataGrid;
var hcv:HierarchicalCollectionView = adg.dataProvider as HierarchicalCollectionView;
var source:IHierarchicalData = hcv.source;
var useDefaultColor:Boolean;
var visible:Boolean;
if (!data) visible = false;
else if (!source.canHaveChildren(data)) visible = false;
else if (source.hasChildren(data))
{
useDefaultColor = true;
visible = true;
}
else
{
visible = true;
var ct:ColorTransform = new ColorTransform();
ct.color = 0xBCB383;
disclosureIcon.transform.colorTransform = ct;
}
if (useDefaultColor) disclosureIcon.transform.colorTransform = defaultColor;
disclosureIcon.visible = visible;
}
}
public class OnDemandCollection extends HierarchicalData
{
public function OnDemandCollection()
{
super();
}
override public function getChildren(node:Object):Object
{
if (node is SummaryGrouping) return SummaryGrouping(node).children;
else if (node is SummaryTransaction) return SummaryTransaction(node).children;
else if (node is Transaction) return Transaction(node).children;
return {};
}
override public function canHaveChildren(node:Object):Boolean
{
if (node is SummaryGrouping)
{
return true;
}
else if (node is SummaryTransaction)
{
var sumTran:SummaryTransaction = SummaryTransaction(node);
return sumTran.numTransactions > 0;
}
else if (node is Transaction)
{
var tran:Transaction = Transaction(node);
return tran.isSplit;
}
else if (node is Split) return false;
else if (node.hasOwnProperty('children'))
{
var list:IList = node['children'] as IList;
return list.length > 0;
}
else return false;
}
}