This is an automated email from the ASF dual-hosted git repository.

harbs pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new 4e186b7442 Added factory for reusing data item renderers
4e186b7442 is described below

commit 4e186b7442872764e27f086a3a03863f09c599aa
Author: Harbs <[email protected]>
AuthorDate: Thu Dec 21 01:31:18 2023 +0200

    Added factory for reusing data item renderers
---
 .../Basic/src/main/resources/basic-manifest.xml    |   1 +
 .../projects/Basic/src/main/royale/BasicClasses.as |   1 +
 .../DataItemRendererFactoryForCollectionView.as    |   2 +
 ...bleDataItemRendererFactoryForCollectionView.as} | 113 ++++++---------------
 4 files changed, 34 insertions(+), 83 deletions(-)

diff --git a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml 
b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
index dc0d7bfd00..51a682c0e4 100644
--- a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
+++ b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
@@ -228,6 +228,7 @@
     <component id="DynamicUpdateItemRendererForArrayListData" 
class="org.apache.royale.html.beads.DynamicUpdateItemRendererForArrayListData"/>
     <component id="DataItemRendererFactoryForHierarchicalData" 
class="org.apache.royale.html.beads.DataItemRendererFactoryForHierarchicalData" 
/>
     <component id="DataItemRendererFactoryForCollectionView" 
class="org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView" />
+    <component id="ReusableDataItemRendererFactoryForCollectionView" 
class="org.apache.royale.html.beads.ReusableDataItemRendererFactoryForCollectionView"
 />
     <component id="SelectionDataItemRendererFactoryForCollectionView" 
class="org.apache.royale.html.beads.SelectionDataItemRendererFactoryForCollectionView"
 />
     <component id="DynamicRemoveAllItemRendererForArrayListData" 
class="org.apache.royale.html.beads.DynamicRemoveAllItemRendererForArrayListData"
 />
     <component id="DynamicRemoveAllByNullItemRendererForArrayListData" 
class="org.apache.royale.html.beads.DynamicRemoveAllByNullItemRendererForArrayListData"
 />
diff --git a/frameworks/projects/Basic/src/main/royale/BasicClasses.as 
b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
index f5591dcad6..91a45a7911 100644
--- a/frameworks/projects/Basic/src/main/royale/BasicClasses.as
+++ b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
@@ -245,6 +245,7 @@ internal class BasicClasses
        import 
org.apache.royale.html.beads.DataItemRendererFactoryForArrayList; 
DataItemRendererFactoryForArrayList;
        import 
org.apache.royale.html.beads.DataItemRendererFactoryForHierarchicalData; 
DataItemRendererFactoryForHierarchicalData;
        import 
org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView; 
DataItemRendererFactoryForCollectionView;
+       import 
org.apache.royale.html.beads.ReusableDataItemRendererFactoryForCollectionView; 
ReusableDataItemRendererFactoryForCollectionView;
        import org.apache.royale.html.supportClasses.DataGroup; DataGroup;
        import org.apache.royale.html.supportClasses.Border; Border;
        import org.apache.royale.html.supportClasses.Viewport; Viewport;
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
index de128b771e..07b387c7a0 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
@@ -77,6 +77,7 @@ package org.apache.royale.html.beads
                 * @royaleignorecoercion 
org.apache.royale.collections.ICollectionView
                 * @royaleignorecoercion 
org.apache.royale.core.IListPresentationModel
                 * @royaleignorecoercion 
org.apache.royale.core.IIndexedItemRenderer
+                * @royaleignorecoercion 
org.apache.royale.core.IIndexedItemRendererInitializer
                 * @royaleignorecoercion 
org.apache.royale.core.IStrandWithModelView
                 * @royaleignorecoercion org.apache.royale.html.beads.IListView
                 */
@@ -152,6 +153,7 @@ package org.apache.royale.html.beads
                 * @private
                 * @royaleignorecoercion 
org.apache.royale.collections.ICollectionView
                 * @royaleignorecoercion 
org.apache.royale.core.IIndexedItemRenderer
+                * @royaleignorecoercion 
org.apache.royale.core.IIndexedItemRendererInitializer
                 * @royaleignorecoercion 
org.apache.royale.core.IStrandWithModelView
                 * @royaleignorecoercion org.apache.royale.html.beads.IListView
                 */
diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/ReusableDataItemRendererFactoryForCollectionView.as
similarity index 58%
copy from 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
copy to 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/ReusableDataItemRendererFactoryForCollectionView.as
index de128b771e..d697b26632 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/ReusableDataItemRendererFactoryForCollectionView.as
@@ -18,76 +18,55 @@
 
////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.beads
 {
+       import org.apache.royale.utils.sendStrandEvent;
+       import org.apache.royale.events.CollectionEvent;
+       import org.apache.royale.core.IStrandWithModelView;
        import org.apache.royale.core.IIndexedItemRenderer;
        import org.apache.royale.core.IIndexedItemRendererInitializer;
        import org.apache.royale.core.IItemRendererOwnerView;
-       import org.apache.royale.core.IStrandWithModelView;
-       import org.apache.royale.events.CollectionEvent;
-       import org.apache.royale.events.Event;
-       import org.apache.royale.events.IEventDispatcher;
-       import org.apache.royale.html.beads.IListView;
-       import org.apache.royale.utils.sendStrandEvent;
-       
        /**
-        * This class creates itemRenderer instances from the data contained 
within an ICollectionView
+        * The ReusableDataItemRendererFactoryForCollectionView class will save 
removed itemRenderers
+        * and reuse them when new item renderers are needed. This is useful 
for large collections
+        * where creating new item renderers can be expensive. Using this class 
can drastically
+        * reduce rendering time at the expense of preventing the unused item 
renderers from being
+        * garbage collected.
+        * 
+        * In an unscientific test, using this class reduced rendering time by 
about a factor of 100 in some cases.
+        * 
+        * Item renderers must be able to be reused. Resetting the data 
property must properly reset the state and
+        * clean any event listeners from the old state.
         */
-       public class DataItemRendererFactoryForCollectionView extends 
DataItemRendererFactoryBase
+       public class ReusableDataItemRendererFactoryForCollectionView extends 
DataItemRendererFactoryForCollectionView
        {
-               public function 
DataItemRendererFactoryForCollectionView(target:Object = null)
+               public function 
ReusableDataItemRendererFactoryForCollectionView(target:Object = null)
                {
                        super(target);
                }
-               
-               /**
-                * the dataProvider as a dispatcher
-                */
-               protected var dped:IEventDispatcher;
+
+               private var _unusedRenderers:Array = [];
 
                /**
                 * @private
                 * @royaleignorecoercion 
org.apache.royale.collections.ICollectionView
                 * @royaleignorecoercion 
org.apache.royale.core.IListPresentationModel
                 * @royaleignorecoercion 
org.apache.royale.core.IIndexedItemRenderer
-                * @royaleignorecoercion 
org.apache.royale.events.IEventDispatcher
-                */
-               override protected function 
dataProviderChangeHandler(event:Event):void
-               {
-                       super.dataProviderChangeHandler(event);
-                       
-                       if(dped)
-                       {
-                               
dped.removeEventListener(CollectionEvent.ITEM_ADDED, itemAddedHandler);
-                               
dped.removeEventListener(CollectionEvent.ITEM_REMOVED, itemRemovedHandler);
-                               
dped.removeEventListener(CollectionEvent.ITEM_UPDATED, itemUpdatedHandler);
-                               dped = null;
-                       }
-                       
-                       if (!dataProviderModel.dataProvider)
-                               return;
-                       
-                       // listen for individual items being added in the 
future.
-                       dped = dataProviderModel.dataProvider as 
IEventDispatcher;
-                       dped.addEventListener(CollectionEvent.ITEM_ADDED, 
itemAddedHandler);
-                       dped.addEventListener(CollectionEvent.ITEM_REMOVED, 
itemRemovedHandler);
-                       dped.addEventListener(CollectionEvent.ITEM_UPDATED, 
itemUpdatedHandler);
-               }
-               
-               /**
-                * @private
-                * @royaleignorecoercion 
org.apache.royale.collections.ICollectionView
-                * @royaleignorecoercion 
org.apache.royale.core.IListPresentationModel
-                * @royaleignorecoercion 
org.apache.royale.core.IIndexedItemRenderer
+                * @royaleignorecoercion 
org.apache.royale.core.IIndexedItemRendererInitializer
                 * @royaleignorecoercion 
org.apache.royale.core.IStrandWithModelView
                 * @royaleignorecoercion org.apache.royale.html.beads.IListView
                 */
-               protected function itemAddedHandler(event:CollectionEvent):void
+               override protected function 
itemAddedHandler(event:CollectionEvent):void
                {
                        if(!dataProviderExist)
                                return;
                        var view:IListView = (_strand as 
IStrandWithModelView).view as IListView;
                        var dataGroup:IItemRendererOwnerView = view.dataGroup;
                        
-                       var ir:IIndexedItemRenderer = 
itemRendererFactory.createItemRenderer() as IIndexedItemRenderer;
+                       var ir:IIndexedItemRenderer;
+                       if(_unusedRenderers.length > 0)
+                               ir = _unusedRenderers.pop();
+
+                       else
+                               ir = itemRendererFactory.createItemRenderer() 
as IIndexedItemRenderer;
 
                        var data:Object = event.item;
                        dataGroup.addItemRendererAt(ir, event.index);
@@ -108,7 +87,8 @@ package org.apache.royale.html.beads
                        }
                        
                        sendStrandEvent(_strand,"itemsCreated");
-                       sendStrandEvent(_strand,"layoutNeeded");
+                       // The itemsCreated handler sends layoutNeeded, so no 
need to do it here.
+                       // sendStrandEvent(_strand,"layoutNeeded");
                }
                
                /**
@@ -119,7 +99,7 @@ package org.apache.royale.html.beads
                 * @royaleignorecoercion 
org.apache.royale.core.IStrandWithModelView
                 * @royaleignorecoercion org.apache.royale.html.beads.IListView
                 */
-               protected function 
itemRemovedHandler(event:CollectionEvent):void
+               override protected function 
itemRemovedHandler(event:CollectionEvent):void
                {
                        if(!dataProviderExist)
                                return;
@@ -130,7 +110,7 @@ package org.apache.royale.html.beads
                        var ir:IIndexedItemRenderer = 
dataGroup.getItemRendererAt(event.index) as IIndexedItemRenderer;
                        if (!ir) return; // may have already been cleaned up, 
possibly when a tree node closes
                        dataGroup.removeItemRenderer(ir);
-                       
+                       _unusedRenderers.push(ir);
                        // adjust the itemRenderers' index to adjust for the 
shift
                        var n:int = dataGroup.numItemRenderers;
                        for (var i:int = event.index; i < n; i++)
@@ -147,39 +127,6 @@ package org.apache.royale.html.beads
 
                        sendStrandEvent(_strand,"layoutNeeded");
                }
-               
-               /**
-                * @private
-                * @royaleignorecoercion 
org.apache.royale.collections.ICollectionView
-                * @royaleignorecoercion 
org.apache.royale.core.IIndexedItemRenderer
-                * @royaleignorecoercion 
org.apache.royale.core.IStrandWithModelView
-                * @royaleignorecoercion org.apache.royale.html.beads.IListView
-                */
-               protected function 
itemUpdatedHandler(event:CollectionEvent):void
-               {
-                       if(!dataProviderExist)
-                               return;
-
-                       var view:IListView = (_strand as 
IStrandWithModelView).view as IListView;
-                       var dataGroup:IItemRendererOwnerView = view.dataGroup;
-                       
-                       // update the given renderer with (possibly) new 
information so it can change its
-                       // appearence or whatever.
-                       var ir:IIndexedItemRenderer = 
dataGroup.getItemRendererAt(event.index) as IIndexedItemRenderer;
-
-                       var data:Object = event.item;
-                       (itemRendererInitializer as 
IIndexedItemRendererInitializer).initializeIndexedItemRenderer(ir, data, 
event.index);
-                       ir.data = data;
-               }
-
-               override protected function get dataProviderLength():int
-               {
-                       return dataProviderModel.dataProvider.length;
-               }
-               
-               override protected function getItemAt(i:int):Object
-               {
-                       return dataProviderModel.dataProvider.getItemAt(i);
-               }
+                               
        }
 }
\ No newline at end of file

Reply via email to