@@ -39,11 +39,10 @@ export class ItemSizeAverager {
39
39
* @param size The measured size of the given range in pixels.
40
40
*/
41
41
addSample ( range : ListRange , size : number ) {
42
- const weight = range . end - range . start ;
43
- const newTotalWeight = this . _totalWeight + weight ;
42
+ const newTotalWeight = this . _totalWeight + range . end - range . start ;
44
43
if ( newTotalWeight ) {
45
44
const newAverageItemSize =
46
- ( size * weight + this . _averageItemSize * this . _totalWeight ) / newTotalWeight ;
45
+ ( size + this . _averageItemSize * this . _totalWeight ) / newTotalWeight ;
47
46
if ( newAverageItemSize ) {
48
47
this . _averageItemSize = newAverageItemSize ;
49
48
this . _totalWeight = newTotalWeight ;
@@ -87,7 +86,6 @@ export class AutoSizeVirtualScrollStrategy implements VirtualScrollStrategy {
87
86
*/
88
87
attach ( viewport : CdkVirtualScrollViewport ) {
89
88
this . _viewport = viewport ;
90
- this . _updateTotalContentSize ( ) ;
91
89
this . _renderContentForOffset ( this . _viewport . measureScrollOffset ( ) ) ;
92
90
}
93
91
@@ -106,11 +104,20 @@ export class AutoSizeVirtualScrollStrategy implements VirtualScrollStrategy {
106
104
/** Called when the length of the data changes. */
107
105
onDataLengthChanged ( ) {
108
106
if ( this . _viewport ) {
109
- this . _updateTotalContentSize ( ) ;
110
107
this . _renderContentForOffset ( this . _viewport . measureScrollOffset ( ) ) ;
111
108
}
112
109
}
113
110
111
+ /** Called when the range of items rendered in the DOM has changed. */
112
+ onContentRendered ( ) {
113
+ if ( this . _viewport ) {
114
+ const renderedContentSize = this . _viewport . measureRenderedContentSize ( ) ;
115
+ this . _averager . addSample (
116
+ this . _viewport . getRenderedRange ( ) , renderedContentSize ) ;
117
+ this . _updateTotalContentSize ( renderedContentSize ) ;
118
+ }
119
+ }
120
+
114
121
/**
115
122
* Update the buffer parameters.
116
123
* @param minBufferPx The minimum amount of buffer rendered beyond the viewport (in pixels).
@@ -179,9 +186,13 @@ export class AutoSizeVirtualScrollStrategy implements VirtualScrollStrategy {
179
186
}
180
187
181
188
/** Update the viewport's total content size. */
182
- private _updateTotalContentSize ( ) {
189
+ private _updateTotalContentSize ( renderedContentSize ) {
183
190
const viewport = this . _viewport ! ;
184
- viewport . setTotalContentSize ( viewport . getDataLength ( ) * this . _averager . getAverageItemSize ( ) ) ;
191
+ const renderedRange = viewport . getRenderedRange ( ) ;
192
+ const totalSize = renderedContentSize +
193
+ ( viewport . getDataLength ( ) - ( renderedRange . end - renderedRange . start ) ) *
194
+ this . _averager . getAverageItemSize ( ) ;
195
+ viewport . setTotalContentSize ( totalSize ) ;
185
196
}
186
197
}
187
198
0 commit comments