@@ -126,11 +126,12 @@ export class Pager extends PagerBase {
126
126
private enumerateViewHolders < T = any > ( cb : ( v : PagerViewHolder ) => T ) {
127
127
let result : T , v : PagerViewHolder ;
128
128
for ( let it = this . _viewHolders . values ( ) , cellItemView : PagerViewHolder = null ; ( cellItemView = it . next ( ) . value ) ; ) {
129
- if ( cellItemView ) {
130
- result = cb ( cellItemView ) ;
131
- if ( result ) {
132
- return result ;
133
- }
129
+ if ( cellItemView [ 'position' ] === undefined ) {
130
+ continue ;
131
+ }
132
+ result = cb ( cellItemView ) ;
133
+ if ( result ) {
134
+ return result ;
134
135
}
135
136
}
136
137
return result ;
@@ -383,11 +384,24 @@ export class Pager extends PagerBase {
383
384
refresh ( ) {
384
385
const nativeView = this . nativeViewProtected ;
385
386
if ( nativeView && this . _pagerAdapter ) {
386
- nativeView . requestLayout ( ) ;
387
+ // nativeView.requestLayout();
387
388
nativeView . getAdapter ( ) . notifyDataSetChanged ( ) ;
388
389
}
389
390
}
390
-
391
+ bindedViewHolders : Set < number > = new Set ( ) ;
392
+ refreshVisibleItems ( ) {
393
+ const view = this . nativeViewProtected ;
394
+ if ( ! view ) {
395
+ return ;
396
+ }
397
+ const ids = Array . from ( this . bindedViewHolders ) . sort ( ( a , b ) => a - b ) ;
398
+ console . log ( 'refreshVisibleItems' , ids ) ;
399
+ this . pagerAdapter . notifyItemRangeChanged ( ids [ 0 ] , ids [ ids . length - 1 ] - ids [ 0 ] + 1 ) ;
400
+ }
401
+
402
+ getViewForItemAtIndex ( index : number ) {
403
+ return this . getChildView ( index ) ;
404
+ }
391
405
onUnloaded ( ) {
392
406
// this._android.setAdapter(null);
393
407
super . onUnloaded ( ) ;
@@ -743,18 +757,14 @@ function initPagerRecyclerAdapter() {
743
757
view = owner . _itemViewLoader ( template . key ) ;
744
758
}
745
759
const isNonSync = view === undefined ;
760
+ console . log ( 'isNonSync' , view ) ;
746
761
if ( isNonSync || view instanceof ProxyViewContainer ) {
747
762
const parentView = new ContentView ( ) ;
748
763
parentView . id = 'pagerViewHolder' ;
749
764
view = parentView ;
750
765
view [ PLACEHOLDER ] = true ;
751
766
}
752
767
owner . _addView ( view ) ;
753
- // sp._setupAsRootView(owner._context);
754
- // //@ts -ignore
755
- // sp.parent = owner;
756
- // sp._isAddedToNativeVisualTree = true;
757
- // sp.callLoaded();
758
768
view . nativeView . setLayoutParams ( new android . view . ViewGroup . LayoutParams ( android . view . ViewGroup . LayoutParams . MATCH_PARENT , android . view . ViewGroup . LayoutParams . MATCH_PARENT ) ) ;
759
769
760
770
initPagerViewHolder ( ) ;
@@ -810,6 +820,11 @@ function initPagerRecyclerAdapter() {
810
820
index = index - 1 ;
811
821
}
812
822
}
823
+ if ( holder [ 'position' ] !== undefined ) {
824
+ owner . bindedViewHolders . delete ( holder [ 'position' ] ) ;
825
+ }
826
+ holder [ 'position' ] = index ;
827
+ owner . bindedViewHolders . add ( holder [ 'position' ] ) ;
813
828
const bindingContext = owner . _getDataItem ( index ) ;
814
829
let view = holder . view ;
815
830
const isNonSync = holder . view [ PLACEHOLDER ] === true ;
@@ -828,11 +843,24 @@ function initPagerRecyclerAdapter() {
828
843
view = args . view ;
829
844
// the view has been changed on the event handler
830
845
( holder . view as ContentView ) . content = args . view ;
846
+ } else if ( view instanceof ContentView ) {
847
+ view = view . content ;
831
848
}
832
849
owner . _prepareItem ( holder . view , index ) ;
833
850
834
851
// TODO: find a way to add to existing margin
835
- view . marginLeft = view . marginRight = Utils . layout . toDeviceIndependentPixels ( owner . _lastPeaking ) ;
852
+ if ( owner . orientation === 'vertical' ) {
853
+ view . marginTop = view . marginBottom = Utils . layout . toDeviceIndependentPixels ( owner . _lastPeaking ) ;
854
+ } else {
855
+ view . marginLeft = view . marginRight = Utils . layout . toDeviceIndependentPixels ( owner . _lastPeaking ) ;
856
+ }
857
+ }
858
+ }
859
+ onViewRecycled ( holder ) {
860
+ const owner = this . owner ? this . owner . get ( ) : null ;
861
+ if ( owner ) {
862
+ delete owner . bindedViewHolders [ holder [ 'position' ] ] ;
863
+ holder [ 'position' ] = undefined ;
836
864
}
837
865
}
838
866
@@ -916,45 +944,61 @@ function initStaticPagerStateAdapter() {
916
944
return null ;
917
945
}
918
946
919
- const view = owner . _childrenViewsType . get ( type ) ;
920
- const sp = new StackLayout ( ) ; // Pager2 requires match_parent so add a parent with to fill
921
- if ( view && ! view . parent ) {
922
- sp . addChild ( view ) ;
923
- } else {
924
- sp [ PLACEHOLDER ] = true ;
925
- }
926
- owner . _addView ( sp ) ;
947
+ let view = owner . _childrenViewsType . get ( type ) ;
948
+ const isNonSync = view === undefined ;
949
+ // if (isNonSync || view instanceof ProxyViewContainer) {
950
+ const parentView = new ContentView ( ) ;
951
+ parentView . id = 'pagerViewHolder' ;
952
+ parentView . content = view ;
953
+ view = parentView ;
954
+ view [ PLACEHOLDER ] = true ;
955
+ // }
956
+ owner . _addView ( view ) ;
927
957
// sp._setupAsRootView(owner._context);
928
958
// //@ts -ignore
929
959
// sp.parent = owner;
930
960
// sp._isAddedToNativeVisualTree = true;
931
961
// sp.callLoaded();
932
- sp . nativeView . setLayoutParams ( new android . view . ViewGroup . LayoutParams ( android . view . ViewGroup . LayoutParams . MATCH_PARENT , android . view . ViewGroup . LayoutParams . MATCH_PARENT ) ) ;
962
+ view . nativeView . setLayoutParams ( new android . view . ViewGroup . LayoutParams ( android . view . ViewGroup . LayoutParams . MATCH_PARENT , android . view . ViewGroup . LayoutParams . MATCH_PARENT ) ) ;
933
963
934
964
initPagerViewHolder ( ) ;
935
- const holder = new PagerViewHolder ( sp , new WeakRef ( owner ) ) ;
965
+ const holder = new PagerViewHolder ( view , new WeakRef ( owner ) ) ;
936
966
owner . _viewHolders . add ( holder ) ;
937
967
return holder ;
938
968
}
939
969
940
970
onBindViewHolder ( holder : any , index : number ) : void {
941
971
const owner = this . owner ? this . owner . get ( ) : null ;
942
972
if ( owner ) {
973
+ if ( holder [ 'position' ] !== undefined ) {
974
+ owner . bindedViewHolders . delete ( holder [ 'position' ] ) ;
975
+ }
976
+ holder [ 'position' ] = index ;
977
+ owner . bindedViewHolders . add ( holder [ 'position' ] ) ;
978
+ let view = holder . view ;
979
+ const isNonSync = holder . view [ PLACEHOLDER ] === true ;
980
+ view = isNonSync ? view . content : view ;
943
981
const args = {
944
982
eventName : Pager . itemLoadingEvent ,
945
983
object : owner ,
946
984
android : holder ,
947
- ios : undefined ,
948
985
index,
949
- view : holder . view [ PLACEHOLDER ] ? null : holder . view
986
+ // bindingContext,
987
+ view
950
988
} as ItemEventData ;
951
989
952
990
owner . notify ( args ) ;
953
- if ( holder . view [ PLACEHOLDER ] ) {
954
- if ( args . view ) {
955
- holder . view . addChild ( args . view ) ;
956
- }
957
- holder . view [ PLACEHOLDER ] = false ;
991
+ if ( isNonSync && args . view !== view ) {
992
+ view = args . view ;
993
+ // the view has been changed on the event handler
994
+ ( holder . view as ContentView ) . content = args . view ;
995
+ } else if ( view instanceof ContentView ) {
996
+ view = view . content ;
997
+ }
998
+ if ( owner . orientation === 'vertical' ) {
999
+ view . marginTop = view . marginBottom = Utils . layout . toDeviceIndependentPixels ( owner . _lastPeaking ) ;
1000
+ } else {
1001
+ view . marginLeft = view . marginRight = Utils . layout . toDeviceIndependentPixels ( owner . _lastPeaking ) ;
958
1002
}
959
1003
}
960
1004
}
0 commit comments