Skip to content

Commit 696c611

Browse files
author
farfromrefuge
committed
feat: preserveIndexOnItemsChange property
1 parent 7d4bb6f commit 696c611

File tree

3 files changed

+29
-23
lines changed

3 files changed

+29
-23
lines changed

src/ui-pager/index.android.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -307,10 +307,6 @@ export class Pager extends PagerBase {
307307
this.nativeViewProtected.setUserInputEnabled(!value);
308308
}
309309

310-
[itemsProperty.getDefault](): any {
311-
return null;
312-
}
313-
314310
[itemsProperty.setNative](value: any) {
315311
this.setObservableArrayInstance(value);
316312
}
@@ -357,11 +353,16 @@ export class Pager extends PagerBase {
357353
this.initStaticPagerAdapter();
358354
}
359355

360-
[selectedIndexProperty.setNative](value: number) {
356+
[selectedIndexProperty.setNative](value: number, animated = true, requestTransform = false) {
361357
const nativeView = this.nativeViewProtected;
362358
if (this.isLoaded && nativeView) {
363359
const index = this.circularMode ? value + 1 : value;
364-
nativeView.setCurrentItem(index, !this.disableAnimation);
360+
nativeView.setCurrentItem(index, animated && !this.disableAnimation);
361+
if (requestTransform) {
362+
setTimeout(() => {
363+
nativeView.requestTransform();
364+
}, 0);
365+
}
365366
}
366367
}
367368

@@ -397,7 +398,7 @@ export class Pager extends PagerBase {
397398
const ids = Array.from(this.bindedViewHolders).sort((a, b) => a - b);
398399
this.pagerAdapter.notifyItemRangeChanged(ids[0], ids[ids.length - 1] - ids[0] + 1);
399400
}
400-
401+
401402
getViewForItemAtIndex(index: number) {
402403
return this.getChildView(index);
403404
}

src/ui-pager/index.common.ts

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export abstract class PagerBase extends ContainerView implements AddChildFromBui
8282
public circularMode: boolean;
8383
public autoPlayDelay: number;
8484
public autoPlay: boolean;
85+
public preserveIndexOnItemsChange: boolean = false;
8586
// This one works along with existing NS property change event system
8687
public static selectedIndexChangeEvent = 'selectedIndexChange';
8788
public static scrollEvent = 'scroll';
@@ -143,10 +144,14 @@ export abstract class PagerBase extends ContainerView implements AddChildFromBui
143144
if (value instanceof ObservableArray) {
144145
this.mObservableArrayInstance = value as any;
145146
this.mObservableArrayInstance.on(ObservableArray.changeEvent, this._observableArrayHandler);
147+
// } else {
148+
}
149+
this.refresh();
150+
if (this.preserveIndexOnItemsChange) {
151+
this[selectedIndexProperty.setNative](this.selectedIndex, false /* disableAnimation */, true /* requestTransform(Android) */);
146152
} else {
147-
this.refresh();
153+
selectedIndexProperty.coerce(this);
148154
}
149-
selectedIndexProperty.coerce(this);
150155
}
151156

152157
getChildView(index: number): View {
@@ -336,22 +341,22 @@ export abstract class PagerBase extends ContainerView implements AddChildFromBui
336341
return converted;
337342
}
338343

339-
abstract _onItemsChanged(oldValue: any, newValue: any): void;
344+
// abstract _onItemsChanged(oldValue: any, newValue: any): void;
340345
}
341346

342347
export class PagerItem extends GridLayout {}
343348

344-
function onItemsChanged(pager: PagerBase, oldValue, newValue) {
345-
if (oldValue instanceof Observable) {
346-
removeWeakEventListener(oldValue, ObservableArray.changeEvent, pager.refresh, pager);
347-
}
349+
// function onItemsChanged(pager: PagerBase, oldValue, newValue) {
350+
// if (oldValue instanceof Observable) {
351+
// removeWeakEventListener(oldValue, ObservableArray.changeEvent, pager.refresh, pager);
352+
// }
348353

349-
if (newValue instanceof Observable && !(newValue instanceof ObservableArray)) {
350-
addWeakEventListener(newValue, ObservableArray.changeEvent, pager.refresh, pager);
351-
}
354+
// if (newValue instanceof Observable && !(newValue instanceof ObservableArray)) {
355+
// addWeakEventListener(newValue, ObservableArray.changeEvent, pager.refresh, pager);
356+
// }
352357

353-
pager.refresh();
354-
}
358+
// // pager.refresh();
359+
// }
355360

356361
function onItemTemplateChanged(pager: PagerBase, oldValue, newValue) {
357362
pager.itemTemplateUpdated(oldValue, newValue);
@@ -407,8 +412,8 @@ peakingProperty.register(PagerBase);
407412

408413
export const itemsProperty = new Property<PagerBase, any>({
409414
name: 'items',
410-
affectsLayout: true,
411-
valueChanged: onItemsChanged
415+
affectsLayout: true
416+
// valueChanged: onItemsChanged
412417
});
413418
itemsProperty.register(PagerBase);
414419

src/ui-pager/index.ios.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,9 +290,9 @@ export class Pager extends PagerBase {
290290
this.scrollToIndexAnimated(this.selectedIndex, false);
291291
}
292292

293-
[selectedIndexProperty.setNative](value: number) {
293+
[selectedIndexProperty.setNative](value: number, animated = true) {
294294
if (this.isLoaded) {
295-
this.scrollToIndexAnimated(value, !this.disableAnimation);
295+
this.scrollToIndexAnimated(value, animated && !this.disableAnimation);
296296
}
297297
}
298298

0 commit comments

Comments
 (0)