Skip to content

Commit 80e9f9f

Browse files
authored
Merge pull request NativeScript#3047 from NativeScript/offscreen
Add TabView.androidOffscreenTabLimit property
2 parents a7a650f + e59d145 commit 80e9f9f

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

tests/app/ui/tab-view/tab-view-tests.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,60 @@ export class TabViewTest extends testModule.UITest<tabViewModule.TabView> {
275275
TKUnit.assertEqual(actualOldIndex, expectedOldIndex, "expectedOldIndex");
276276
TKUnit.assertEqual(actualNewIndex, expectedNewIndex, "expectedNewIndex");
277277
}
278+
279+
public testAndroidOffscreenTabLimit_Default = function () {
280+
let tabView = this.testView;
281+
if (!tabView.android){
282+
return;
283+
}
284+
285+
// The default setting is 1.
286+
// tabView.androidOffscreenTabLimit = 1;
287+
tabView.items = this._createItems(20);
288+
this.waitUntilTestElementIsLoaded();
289+
for (let index = 0, length = tabView.items.length; index < length; index++){
290+
tabViewTestsNative.selectNativeTab(tabView, index);
291+
TKUnit.waitUntilReady(function () {
292+
return tabView.selectedIndex === index;
293+
}, helper.ASYNC);
294+
}
295+
296+
let viewsWithParent = 0;
297+
let viewsWithoutParent = 0;
298+
for (let i = 0, length = tabView.items.length; i < length; i++){
299+
if (tabView.items[i].view.parent) {
300+
viewsWithParent++;
301+
}
302+
else {
303+
viewsWithoutParent++;
304+
}
305+
}
306+
307+
TKUnit.assertTrue(viewsWithoutParent > viewsWithParent, "Most of the views should be recycled!");
308+
}
309+
310+
public testAndroidOffscreenTabLimit_KeepAllAlive = function () {
311+
let tabView = this.testView;
312+
if (!tabView.android){
313+
return;
314+
}
315+
316+
tabView.androidOffscreenTabLimit = 20;
317+
318+
tabView.items = this._createItems(20);
319+
this.waitUntilTestElementIsLoaded();
320+
for (let index = 0, length = tabView.items.length; index < length; index++){
321+
tabViewTestsNative.selectNativeTab(tabView, index);
322+
TKUnit.waitUntilReady(function () {
323+
return tabView.selectedIndex === index;
324+
}, helper.ASYNC);
325+
}
326+
327+
for (let i = 0, length = tabView.items.length; i < length; i++){
328+
TKUnit.assertNotNull(tabView.items[i].view.parent, `tabView.items[${i}].view should have a parent!`);
329+
}
330+
}
331+
278332
/*
279333
public testBindingIsRefreshedWhenTabViewItemIsUnselectedAndThenSelectedAgain() {
280334

tns-core-modules/ui/tab-view/tab-view-common.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,13 @@ export class TabView extends View implements definition.TabView, AddArrayFromBui
244244
//
245245
}
246246

247+
get androidOffscreenTabLimit(): number {
248+
return undefined;
249+
}
250+
set androidOffscreenTabLimit(value: number) {
251+
//
252+
}
253+
247254
public _onSelectedIndexPropertyChangedSetNativeValue(data: PropertyChangeData) {
248255
var index = this.selectedIndex;
249256
if (types.isUndefined(index)) {

tns-core-modules/ui/tab-view/tab-view.android.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,9 @@ export class TabView extends common.TabView {
214214
}
215215

216216
this._viewPager = new android.support.v4.view.ViewPager(this._context);
217+
if (this._androidOffscreenTabLimit !== 1) {
218+
this._viewPager.setOffscreenPageLimit(this._androidOffscreenTabLimit);
219+
}
217220
this._viewPager.setId(this._androidViewId);
218221
var lp = new org.nativescript.widgets.CommonLayoutParams();
219222
lp.row = 1;
@@ -332,6 +335,20 @@ export class TabView extends common.TabView {
332335
public _getAndroidTabView(): org.nativescript.widgets.TabLayout {
333336
return this._tabLayout;
334337
}
338+
339+
private _androidOffscreenTabLimit: number = 1;
340+
get androidOffscreenTabLimit(): number {
341+
return this._androidOffscreenTabLimit;
342+
}
343+
set androidOffscreenTabLimit(value: number) {
344+
if (value !== this._androidOffscreenTabLimit) {
345+
this._androidOffscreenTabLimit = value;
346+
if (this._viewPager) {
347+
this._viewPager.setOffscreenPageLimit(value);
348+
}
349+
}
350+
}
351+
335352
}
336353

337354
export class TabViewStyler implements style.Styler {

tns-core-modules/ui/tab-view/tab-view.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,12 @@ declare module "ui/tab-view" {
114114
*/
115115
iosIconRenderingMode: string;
116116

117+
/**
118+
* Gets or sets the number of tabs that should be retained to either side of the current tab in the view hierarchy in an idle state.
119+
* Tabs beyond this limit will be recreated from the TabView when needed.
120+
*/
121+
androidOffscreenTabLimit: number;
122+
117123
/**
118124
* String value used when hooking to the selectedIndexChanged event.
119125
*/

0 commit comments

Comments
 (0)