1

ADG に遅延読み込みを実装しようとしています。そして、返された子を展開されたノードに追加する必要があるところに行き詰まっています。

現在、私はやっています:

private function childrenloaded(data:*,item:*):void
{
    var len:int = data.length;
    for(var i=0;i<len;i++)
        (internalMainGrid.dataProvider as HierarchicalCollectionView).addChild(item, data[i]);
}

これは正常に動作しますが、遅いです。(合計 21,990 ミリ秒: 919 レコード) これを高速化する方法はありますか? - 子を直接設定するような例:

var d:LazyHierarchicalData = (internalMainGrid.dataProvider as HierarchicalCollectionView).source as LazyHierarchicalData;
var ind:int = (d.source as RemoteCursorArray).getItemIndex(item);
(d.source as RemoteCursorArray)[ind].children = data;
(d.source as RemoteCursorArray).dispatchEvent(new CollectionEvent(CollectionEvent.COLLECTION_CHANGE));

しかし、これはビューをリフレッシュしていません。

より良い解決策への助けや方向性は大歓迎です。前もって感謝します!

4

2 に答える 2

1

私も同じことをしました。私が見つけたものから-GroupingCollection(2)および/またはSummaryRowを使用すると、実際に速度が低下します。言うまでもなく、特定のノードで新しいデータをフェッチすると、ツリー全体の開閉がリセットされます。

スモークテストのパフォーマンスから、約2000行をプル/ペイントするのに約5秒かかります。現在、各ノードの100〜200行で約1/2秒以下かかります(最初にADGを画面に呼び出したときの最初のペイントラグはカウントされません)。

私のために、私は次のことをしました:

  1. HierarchicalDatadbから毎回フェッチするサマリーデータに基づいて子ノードが存在するタイミングをカスタマイズし、表示する子が含まれるプロパティを指定するように拡張します(childrenプロパティと異なる場合)-これは、で使用するモデルのためです。 RobotLegsMVCプラットフォーム。
  2. を拡張しAdvancedDataGridGroupItemRendererて、開示アイコン(三角形のグラフィック)の色を視覚的に変更します。これにより、フェッチする必要のある要素と、すでにデータが存在するノードをユーザーに知らせることができます。これをgroupItemRendererプロパティに割り当てます。
  3. リスナーを使用AdvancedDataGridEvent.ITEM_OPENしてevent.itemプロパティを含むイベントをディスパッチし、コマンド>サービス>レスポンダーがUIによって要求された正確なノードでモデルを更新するようにします(子プロパティに追加します)。
  4. CollectionChangeEvent最上位のコレクションに適切なものを追加します(子はArrayCollectionsです-ネストされたコレクションはバインドされていません)
  5. レスポンダーが完了を宣言した後、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;
    }
}
于 2012-09-21T16:49:34.607 に答える
0

collection_changeからイベントをディスパッチして、同じ dataProvider でビューの変更を開始するか、メソッド (の実装者として実装されているメソッドに属する) をinternalMainGrid.dataProvider呼び出す必要があります。refresh()ICollectionViewHierarchicalCollectionViewIHierarchicalCollectionView

于 2012-09-20T12:17:39.543 に答える