9
9
LOADMOREITEMS ,
10
10
Orientation ,
11
11
PagerBase ,
12
- PagerItem ,
13
12
Transformer ,
14
13
autoPlayProperty ,
15
14
autoplayDelayProperty ,
@@ -61,7 +60,9 @@ export class Pager extends PagerBase {
61
60
private _pagerAdapter : PagerRecyclerAdapter ;
62
61
private _views : any [ ] ;
63
62
private _pageListener : any ;
64
- public _realizedItems = new Map < android . view . View , View > ( ) ;
63
+ // used to store viewHolder and thus their corresponding Views
64
+ // used to "destroy" cells when possible
65
+ _viewHolders = new Set < WeakRef < PagerViewHolder > > ( ) ;
65
66
public _childrenViewsType = new Map < number , View > ( ) ;
66
67
public _realizedTemplates = new Map < string , Map < android . view . View , View > > ( ) ;
67
68
lastEvent = 0 ;
@@ -163,6 +164,27 @@ export class Pager extends PagerBase {
163
164
}
164
165
}
165
166
167
+ private enumerateViewHolders < T = any > ( cb : ( v : PagerViewHolder ) => T ) {
168
+ let result : T , v : PagerViewHolder ;
169
+ for ( let it = this . _viewHolders . values ( ) , cellItemView : WeakRef < PagerViewHolder > = null ; ( cellItemView = it . next ( ) . value ) ; ) {
170
+ v = cellItemView ?. get ( ) ;
171
+ if ( v ) {
172
+ result = cb ( v ) ;
173
+ if ( result ) {
174
+ return result ;
175
+ }
176
+ }
177
+ }
178
+ return result ;
179
+ }
180
+
181
+ getChildView ( index : number ) : View {
182
+ if ( this . _childrenViews ) {
183
+ return this . _childrenViews [ index ] . view ;
184
+ }
185
+ return this . enumerateViewHolders < View > ( ( v ) => ( v . getAdapterPosition ( ) === index ? v . view : undefined ) ) ;
186
+ }
187
+
166
188
protected _removeChildView ( index : number ) {
167
189
const type = this . _childrenViews [ index ] . type ;
168
190
this . _childrenViewsType . delete ( type ) ;
@@ -309,11 +331,16 @@ export class Pager extends PagerBase {
309
331
this . _initAutoPlay ( this . autoPlay ) ;
310
332
}
311
333
} ;
312
-
334
+ disposeViewHolderViews ( ) {
335
+ this . enumerateViewHolders ( ( v ) => {
336
+ this . _removeViewCore ( v . view ) ;
337
+ } ) ;
338
+ this . _viewHolders = new Set ( ) ;
339
+ }
313
340
public disposeNativeView ( ) {
314
341
this . off ( View . layoutChangedEvent , this . onLayoutChange , this ) ;
315
342
this . _childrenViews = null ;
316
- this . _realizedItems . clear ( ) ;
343
+ this . disposeViewHolderViews ( ) ;
317
344
this . _realizedTemplates . clear ( ) ;
318
345
this . _pageListener = null ;
319
346
// setAdapter(null) will destroy views
@@ -465,13 +492,22 @@ export class Pager extends PagerBase {
465
492
// this._android.setAdapter(null);
466
493
super . onUnloaded ( ) ;
467
494
}
468
-
469
- eachChildView ( callback : ( child : View ) => boolean ) : void {
470
- if ( this . _realizedItems && this . _realizedItems . size > 0 ) {
471
- this . _realizedItems . forEach ( ( view , key ) => {
472
- callback ( view ) ;
473
- } ) ;
474
- }
495
+ eachChild ( callback : ( child : ViewBase ) => boolean ) {
496
+ super . eachChild ( callback ) ;
497
+ // used for css updates (like theme change)
498
+ this . enumerateViewHolders ( ( v ) => {
499
+ const view = v . view ;
500
+ if ( view ) {
501
+ if ( view . parent instanceof Pager ) {
502
+ callback ( view ) ;
503
+ } else {
504
+ // in some cases (like item is unloaded from another place (like angular) view.parent becomes undefined)
505
+ if ( view . parent ) {
506
+ callback ( view . parent ) ;
507
+ }
508
+ }
509
+ }
510
+ } ) ;
475
511
}
476
512
477
513
updateAdapter ( ) {
@@ -810,11 +846,10 @@ function initPagerRecyclerAdapter() {
810
846
owner . _addView ( sp ) ;
811
847
sp . nativeView . setLayoutParams ( new android . view . ViewGroup . LayoutParams ( android . view . ViewGroup . LayoutParams . MATCH_PARENT , android . view . ViewGroup . LayoutParams . MATCH_PARENT ) ) ;
812
848
813
- owner . _realizedItems . set ( sp . nativeView , sp ) ;
814
-
815
849
initPagerViewHolder ( ) ;
816
-
817
- return new PagerViewHolder ( new WeakRef ( sp ) , new WeakRef ( owner ) ) ;
850
+ const holder = new PagerViewHolder ( new WeakRef ( sp ) , new WeakRef ( owner ) ) ;
851
+ owner . _viewHolders . add ( new WeakRef ( holder ) ) ;
852
+ return holder ;
818
853
}
819
854
820
855
getPosition ( index : number ) : number {
@@ -1029,7 +1064,13 @@ function initStaticPagerStateAdapter() {
1029
1064
StaticPagerStateAdapter = StaticPagerStateAdapterImpl as any ;
1030
1065
}
1031
1066
1032
- let PagerViewHolder ;
1067
+ interface PagerViewHolder extends androidx . recyclerview . widget . RecyclerView . ViewHolder {
1068
+ // tslint:disable-next-line:no-misused-new
1069
+ new ( owner : WeakRef < View > , pager : WeakRef < Pager > ) : PagerViewHolder ;
1070
+ view : View ;
1071
+ }
1072
+ // eslint-disable-next-line no-redeclare
1073
+ let PagerViewHolder : PagerViewHolder ;
1033
1074
1034
1075
function initPagerViewHolder ( ) {
1035
1076
if ( PagerViewHolder ) {
@@ -1044,7 +1085,7 @@ function initPagerViewHolder() {
1044
1085
}
1045
1086
1046
1087
get view ( ) : View {
1047
- return this . owner ? this . owner . get ( ) : null ;
1088
+ return this . owner ?. get ( ) ;
1048
1089
}
1049
1090
}
1050
1091
@@ -1060,7 +1101,7 @@ function initZoomOutPageTransformer() {
1060
1101
1061
1102
@NativeClass
1062
1103
@Interfaces ( [ androidx . viewpager2 . widget . ViewPager2 . PageTransformer ] )
1063
- class ZoomOutPageTransformerImpl extends androidx . viewpager2 . widget . ViewPager2 . PageTransformer {
1104
+ class ZoomOutPageTransformerImpl extends java . lang . Object {
1064
1105
owner : WeakRef < Pager > ;
1065
1106
1066
1107
constructor ( ) {
@@ -1093,7 +1134,7 @@ function initZoomInPageTransformer() {
1093
1134
1094
1135
@NativeClass
1095
1136
@Interfaces ( [ androidx . viewpager2 . widget . ViewPager2 . PageTransformer ] )
1096
- class ZoomInPageTransformerImpl extends androidx . viewpager2 . widget . ViewPager2 . PageTransformer {
1137
+ class ZoomInPageTransformerImpl extends java . lang . Object {
1097
1138
owner : WeakRef < Pager > ;
1098
1139
1099
1140
constructor ( ) {
0 commit comments