@@ -32,6 +32,7 @@ class Box extends Component implements IDataComponent {
32
32
**/
33
33
@:clonable @:behaviour (DefaultBehaviour ) public var icon : Variant ;
34
34
@:clonable @:behaviour (DataSourceBehaviour ) public var dataSource : DataSource <Dynamic >;
35
+ @:clonable @:behaviour (DefaultBehaviour , true ) public var cacheItemRenderers : Bool ;
35
36
36
37
@:noCompletion private var _layoutName : String ;
37
38
@:clonable public var layoutName (get , set ): String ;
@@ -76,11 +77,11 @@ class Box extends Component implements IDataComponent {
76
77
_defaultLayoutClass = DefaultLayout ;
77
78
}
78
79
}
79
-
80
+
80
81
@:noCompletion private var _direction : String = null ;
81
82
private override function applyStyle (style : Style ) {
82
83
super .applyStyle (style );
83
-
84
+
84
85
if (style .direction != null && style .direction != _direction ) {
85
86
_direction = style .direction ;
86
87
this .layout = LayoutFactory .createFromName (_direction );
@@ -99,6 +100,7 @@ class Box extends Component implements IDataComponent {
99
100
// ***********************************************************************************************************
100
101
private class Builder extends CompositeBuilder {
101
102
private var _box : Box ;
103
+ private var _cachedItemRenderers : Array <ItemRenderer >;
102
104
103
105
public function new (box : Box ) {
104
106
super (box );
@@ -143,36 +145,60 @@ private class Builder extends CompositeBuilder {
143
145
_box .itemRenderer .handleVisibility (false );
144
146
}
145
147
148
+ var childRenderers = _component .findComponents (ItemRenderer , 1 );
149
+
146
150
for (i in 0 ... dataSource .size ) {
147
151
var item = dataSource .get (i );
148
- var renderer = findRenderer (item );
152
+ var renderer = findRenderer (item , childRenderers );
153
+ if (renderer == null && _box .cacheItemRenderers && _cachedItemRenderers != null ) {
154
+ renderer = findRenderer (item , _cachedItemRenderers );
155
+ if (renderer != null ){
156
+ _cachedItemRenderers .remove (item );
157
+ _box .addComponent (renderer );
158
+ }
159
+ }
149
160
if (renderer == null ) {
150
161
renderer = itemRenderer .cloneComponent ();
151
162
_box .addComponent (renderer );
152
163
}
164
+
153
165
renderer .itemIndex = i ;
154
166
_box .setComponentIndex (renderer , i );
155
167
renderer .data = item ;
156
168
}
157
-
158
- for (child in _component .findComponents (ItemRenderer )) {
169
+ for (child in childRenderers ) {
159
170
if (child == _box .itemRenderer ) {
160
171
continue ;
161
172
}
162
173
if (dataSource .indexOf (child .data ) == - 1 ) {
163
- _box .removeComponent (child );
174
+ _box .removeComponent (child , ! _box .cacheItemRenderers );
175
+ if (_box .cacheItemRenderers ) {
176
+ if (_cachedItemRenderers == null ){
177
+ _cachedItemRenderers = [];
178
+ }
179
+ _cachedItemRenderers .push (child );
180
+ }
164
181
}
165
182
}
166
183
}
167
184
168
- private function findRenderer (data : Dynamic ): ItemRenderer {
169
- for (child in _component . findComponents ( ItemRenderer ) ) {
185
+ private function findRenderer (data : Dynamic , renderers : Array < ItemRenderer > ): ItemRenderer {
186
+ for (child in renderers ) {
170
187
if (child .data == data ) {
171
188
return child ;
172
189
}
173
190
}
174
191
return null ;
175
192
}
193
+
194
+ public override function destroy () {
195
+ if (_cachedItemRenderers != null ) {
196
+ for (itemRenderer in _cachedItemRenderers ) {
197
+ itemRenderer .disposeComponent ();
198
+ }
199
+ }
200
+ super .destroy ();
201
+ }
176
202
}
177
203
178
204
// ***********************************************************************************************************
0 commit comments