@@ -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
@@ -96,21 +94,27 @@ export class AutoSizeVirtualScrollStrategy implements VirtualScrollStrategy {
96
94
this . _viewport = null ;
97
95
}
98
96
99
- /** Called when the viewport is scrolled . */
97
+ /** Implemented as part of VirtualScrollStrategy . */
100
98
onContentScrolled ( ) {
101
99
if ( this . _viewport ) {
102
100
this . _renderContentForOffset ( this . _viewport . measureScrollOffset ( ) ) ;
103
101
}
104
102
}
105
103
106
- /** Called when the length of the data changes . */
104
+ /** Implemented as part of VirtualScrollStrategy . */
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
+ /** Implemented as part of VirtualScrollStrategy. */
112
+ onContentRendered ( ) {
113
+ if ( this . _viewport ) {
114
+ this . _checkRenderedContentSize ( ) ;
115
+ }
116
+ }
117
+
114
118
/**
115
119
* Update the buffer parameters.
116
120
* @param minBufferPx The minimum amount of buffer rendered beyond the viewport (in pixels).
@@ -122,6 +126,17 @@ export class AutoSizeVirtualScrollStrategy implements VirtualScrollStrategy {
122
126
this . _addBufferPx = addBufferPx ;
123
127
}
124
128
129
+ /**
130
+ * Checks the size of the currently rendered content and uses it to update the estimated item size
131
+ * and estimated total content size.
132
+ */
133
+ private _checkRenderedContentSize ( ) {
134
+ const viewport = this . _viewport ! ;
135
+ const renderedContentSize = viewport . measureRenderedContentSize ( ) ;
136
+ this . _averager . addSample ( viewport . getRenderedRange ( ) , renderedContentSize ) ;
137
+ this . _updateTotalContentSize ( renderedContentSize ) ;
138
+ }
139
+
125
140
/**
126
141
* Render the content that we estimate should be shown for the given scroll offset.
127
142
* Note: must not be called if `this._viewport` is null
@@ -179,9 +194,13 @@ export class AutoSizeVirtualScrollStrategy implements VirtualScrollStrategy {
179
194
}
180
195
181
196
/** Update the viewport's total content size. */
182
- private _updateTotalContentSize ( ) {
197
+ private _updateTotalContentSize ( renderedContentSize : number ) {
183
198
const viewport = this . _viewport ! ;
184
- viewport . setTotalContentSize ( viewport . getDataLength ( ) * this . _averager . getAverageItemSize ( ) ) ;
199
+ const renderedRange = viewport . getRenderedRange ( ) ;
200
+ const totalSize = renderedContentSize +
201
+ ( viewport . getDataLength ( ) - ( renderedRange . end - renderedRange . start ) ) *
202
+ this . _averager . getAverageItemSize ( ) ;
203
+ viewport . setTotalContentSize ( totalSize ) ;
185
204
}
186
205
}
187
206
0 commit comments