@@ -216,6 +216,7 @@ export class CollectionView extends CollectionViewBase {
216216 private _scrollOrLoadMoreChangeCount = 0 ;
217217 private _nScrollListener : com . nativescript . collectionview . OnScrollListener . Listener ;
218218 scrolling = false ;
219+ needsScrollStartEvent = false ;
219220
220221 private _hlayoutParams : android . view . ViewGroup . LayoutParams ;
221222 private _vlayoutParams : android . view . ViewGroup . LayoutParams ;
@@ -360,22 +361,34 @@ export class CollectionView extends CollectionViewBase {
360361 }
361362 }
362363 }
364+ private computeScrollEventData ( view : androidx . recyclerview . widget . RecyclerView , eventName : string , dx ?: number , dy ?: number ) {
365+ const horizontal = this . isHorizontal ( ) ;
366+ const offset = horizontal ? view . computeHorizontalScrollOffset ( ) : view . computeVerticalScrollOffset ( ) ;
367+ const range = horizontal ? view . computeHorizontalScrollRange ( ) : view . computeVerticalScrollRange ( ) ;
368+ const extent = horizontal ? view . computeHorizontalScrollExtent ( ) : view . computeVerticalScrollExtent ( ) ;
369+ return {
370+ object : this ,
371+ eventName,
372+ scrollOffset : offset / layout . getDisplayDensity ( ) ,
373+ scrollOffsetPercentage : offset / ( range - extent ) ,
374+ dx,
375+ dy
376+ } ;
377+ }
363378
364379 public onScrolled ( view : androidx . recyclerview . widget . RecyclerView , dx : number , dy : number ) {
365380 if ( ! this || ! this . scrolling ) {
366381 return ;
367382 }
383+ if ( this . needsScrollStartEvent ) {
384+ this . needsScrollStartEvent = false ;
385+ if ( this . hasListeners ( CollectionViewBase . scrollStartEvent ) ) {
386+ this . notify ( this . computeScrollEventData ( view , CollectionViewBase . scrollStartEvent , dx , dy ) ) ;
387+ }
388+ }
368389
369390 if ( this . hasListeners ( CollectionViewBase . scrollEvent ) ) {
370- const offset = this . isHorizontal ( ) ? view . computeHorizontalScrollOffset ( ) : view . computeVerticalScrollOffset ( ) ;
371- const range = view . computeHorizontalScrollRange ( ) ;
372- const extent = view . computeHorizontalScrollExtent ( ) ;
373- this . notify ( {
374- object : this ,
375- eventName : CollectionViewBase . scrollEvent ,
376- scrollOffset : offset / layout . getDisplayDensity ( ) ,
377- scrollOffsetPercentage : offset / ( range - extent )
378- } ) ;
391+ this . notify ( this . computeScrollEventData ( view , CollectionViewBase . scrollEvent , dx , dy ) ) ;
379392 }
380393
381394 if ( this . hasListeners ( CollectionViewBase . loadMoreItemsEvent ) && this . items ) {
@@ -415,25 +428,18 @@ export class CollectionView extends CollectionViewBase {
415428 this . scrolling = false ;
416429
417430 if ( this . hasListeners ( CollectionViewBase . scrollEndEvent ) ) {
418- const offset = this . isHorizontal ( ) ? view . computeHorizontalScrollOffset ( ) : view . computeVerticalScrollOffset ( ) ;
419- const range = view . computeHorizontalScrollRange ( ) ;
420- const extent = view . computeHorizontalScrollExtent ( ) ;
421- this . notify ( {
422- object : this ,
423- eventName : CollectionViewBase . scrollEndEvent ,
424- scrollOffset : offset / layout . getDisplayDensity ( ) ,
425- scrollOffsetPercentage : offset / ( range - extent )
426- } ) ;
431+ this . notify ( this . computeScrollEventData ( view , CollectionViewBase . scrollEndEvent ) ) ;
427432 }
428433 } else if ( ! this . scrolling && newState === 1 ) {
429434 //SCROLL_STATE_DRAGGING
435+ this . needsScrollStartEvent = true ;
430436 this . scrolling = true ;
431437 }
432438 }
433439
434440 public addEventListener ( arg : string , callback : any , thisArg ?: any ) {
435441 super . addEventListener ( arg , callback , thisArg ) ;
436- if ( arg === CollectionViewBase . scrollEvent || arg === CollectionViewBase . loadMoreItemsEvent ) {
442+ if ( arg === CollectionViewBase . scrollEvent || arg === CollectionViewBase . scrollStartEvent || arg === CollectionViewBase . scrollEndEvent || arg === CollectionViewBase . loadMoreItemsEvent ) {
437443 this . _scrollOrLoadMoreChangeCount ++ ;
438444 this . attachScrollListener ( ) ;
439445 }
@@ -442,7 +448,7 @@ export class CollectionView extends CollectionViewBase {
442448 public removeEventListener ( arg : string , callback : any , thisArg ?: any ) {
443449 super . removeEventListener ( arg , callback , thisArg ) ;
444450
445- if ( arg === CollectionViewBase . scrollEvent || arg === CollectionViewBase . loadMoreItemsEvent ) {
451+ if ( arg === CollectionViewBase . scrollEvent || arg === CollectionViewBase . scrollStartEvent || arg === CollectionViewBase . scrollEndEvent || arg === CollectionViewBase . loadMoreItemsEvent ) {
446452 this . _scrollOrLoadMoreChangeCount -- ;
447453 this . dettachScrollListener ( ) ;
448454 }
0 commit comments