Skip to content

Commit 7d39d03

Browse files
author
farfromrefug
committed
fix(android): prevent possible errors on view unload
1 parent b6676f0 commit 7d39d03

File tree

1 file changed

+22
-28
lines changed

1 file changed

+22
-28
lines changed

src/collectionview/index.android.ts

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -317,11 +317,7 @@ export class CollectionView extends CollectionViewBase {
317317
nativeView.setRecycledViewPool(null);
318318
this.recycledViewPoolDisposeListener = null;
319319
this.recycledViewPool = null;
320-
if (nativeView.scrollListener) {
321-
this.nativeView.removeOnScrollListener(nativeView.scrollListener);
322-
nativeView.scrollListener = null;
323-
this._nScrollListener = null;
324-
}
320+
this.detachScrollListenerIfNecessary(true);
325321
nativeView.sizeChangedListener = null;
326322
nativeView.layoutManager = null;
327323
this._listViewAdapter = null;
@@ -333,12 +329,14 @@ export class CollectionView extends CollectionViewBase {
333329
super.disposeNativeView();
334330
}
335331

336-
@profile
337332
onLoaded() {
338333
super.onLoaded();
339-
this.attachScrollListener();
340-
// this.refresh();
334+
this.attachScrollListenerIfNecessary();
341335
}
336+
// onUnloaded() {
337+
// super.onUnloaded();
338+
// this.detachScrollListenerIfNecessary();
339+
// }
342340

343341
_getSpanSize: (item, index) => number;
344342
public getViewForItemAtIndex(index: number): View {
@@ -372,30 +370,26 @@ export class CollectionView extends CollectionViewBase {
372370
return this._getSpanSize;
373371
}
374372

375-
@profile
376-
private attachScrollListener() {
377-
if (this._scrollOrLoadMoreChangeCount > 0 && this.isLoaded) {
378-
const nativeView = this.nativeViewProtected;
379-
if (!nativeView.scrollListener) {
380-
this._nScrollListener = new com.nativescript.collectionview.OnScrollListener.Listener({
381-
onScrollStateChanged: this.onScrollStateChanged.bind(this),
382-
onScrolled: this.onScrolled.bind(this)
383-
});
384-
const scrollListener = new com.nativescript.collectionview.OnScrollListener(this._nScrollListener);
385-
nativeView.addOnScrollListener(scrollListener);
386-
nativeView.scrollListener = scrollListener;
387-
}
373+
private attachScrollListenerIfNecessary() {
374+
const nativeView = this.nativeViewProtected;
375+
if (this._scrollOrLoadMoreChangeCount > 0 && nativeView && !nativeView.scrollListener) {
376+
this._nScrollListener = new com.nativescript.collectionview.OnScrollListener.Listener({
377+
onScrollStateChanged: this.onScrollStateChanged.bind(this),
378+
onScrolled: this.onScrolled.bind(this)
379+
});
380+
const scrollListener = new com.nativescript.collectionview.OnScrollListener(this._nScrollListener);
381+
nativeView.addOnScrollListener(scrollListener);
382+
nativeView.scrollListener = scrollListener;
388383
}
389384
}
390-
391-
private detachScrollListener() {
392-
if (this._scrollOrLoadMoreChangeCount === 0 && this.isLoaded) {
393-
const nativeView = this.nativeViewProtected;
385+
private detachScrollListenerIfNecessary(force = false) {
386+
const nativeView = this.nativeViewProtected;
387+
if (force || (this._scrollOrLoadMoreChangeCount === 0 && nativeView)) {
394388
if (nativeView.scrollListener) {
395389
this.nativeView.removeOnScrollListener(nativeView.scrollListener);
396390
nativeView.scrollListener = null;
397-
this._nScrollListener = null;
398391
}
392+
this._nScrollListener = null;
399393
}
400394
}
401395
private computeScrollEventData(view: androidx.recyclerview.widget.RecyclerView, eventName: string, dx?: number, dy?: number) {
@@ -473,7 +467,7 @@ export class CollectionView extends CollectionViewBase {
473467
super.addEventListener(arg, callback, thisArg);
474468
if (arg === CollectionViewBase.scrollEvent || arg === CollectionViewBase.scrollStartEvent || arg === CollectionViewBase.scrollEndEvent || arg === CollectionViewBase.loadMoreItemsEvent) {
475469
this._scrollOrLoadMoreChangeCount++;
476-
this.attachScrollListener();
470+
this.attachScrollListenerIfNecessary();
477471
}
478472
}
479473

@@ -482,7 +476,7 @@ export class CollectionView extends CollectionViewBase {
482476

483477
if (arg === CollectionViewBase.scrollEvent || arg === CollectionViewBase.scrollStartEvent || arg === CollectionViewBase.scrollEndEvent || arg === CollectionViewBase.loadMoreItemsEvent) {
484478
this._scrollOrLoadMoreChangeCount--;
485-
this.detachScrollListener();
479+
this.detachScrollListenerIfNecessary();
486480
}
487481
}
488482

0 commit comments

Comments
 (0)