diff --git a/tns-core-modules/ui/list-view/list-view-common.ts b/tns-core-modules/ui/list-view/list-view-common.ts index 67a2b8218..b45910532 100644 --- a/tns-core-modules/ui/list-view/list-view-common.ts +++ b/tns-core-modules/ui/list-view/list-view-common.ts @@ -23,8 +23,9 @@ export abstract class ListViewBase extends View implements ListViewDefinition { public static itemTapEvent = "itemTap"; public static loadMoreItemsEvent = "loadMoreItems"; // TODO: get rid of such hacks. - public static knownFunctions = ["itemTemplateSelector"]; //See component-builder.ts isKnownFunction + public static knownFunctions = ["itemTemplateSelector", "itemIdGenerator"]; //See component-builder.ts isKnownFunction + private _itemIdGenerator: (item: any, index: number, items: any) => number = (_item: any, index: number) => index; private _itemTemplateSelector: (item: any, index: number, items: any) => string; private _itemTemplateSelectorBindable = new Label(); public _defaultTemplate: KeyedTemplate = { @@ -72,6 +73,14 @@ export abstract class ListViewBase extends View implements ListViewDefinition { } } + get itemIdGenerator(): (item: any, index: number, items: any) => number { + return this._itemIdGenerator; + } + + set itemIdGenerator(generatorFn: (item: any, index: number, items: any) => number) { + this._itemIdGenerator = generatorFn; + } + public refresh() { // } diff --git a/tns-core-modules/ui/list-view/list-view.android.ts b/tns-core-modules/ui/list-view/list-view.android.ts index 101c53f87..85832436d 100644 --- a/tns-core-modules/ui/list-view/list-view.android.ts +++ b/tns-core-modules/ui/list-view/list-view.android.ts @@ -216,14 +216,19 @@ function ensureListViewAdapterClass() { public getItem(i: number) { if (this.owner && this.owner.items && i < this.owner.items.length) { let getItem = (this.owner.items).getItem; - return getItem ? getItem(i) : this.owner.items[i]; + return getItem ? getItem.call(this.owner.items, i) : this.owner.items[i]; } return null; } public getItemId(i: number) { - return long(i); + let item = this.getItem(i); + let id = i; + if (this.owner && item && this.owner.items) { + id = this.owner.itemIdGenerator(item, i, this.owner.items); + } + return long(id); } public hasStableIds(): boolean { diff --git a/tns-core-modules/ui/list-view/list-view.d.ts b/tns-core-modules/ui/list-view/list-view.d.ts index c4db6d357..e4cbe4e08 100644 --- a/tns-core-modules/ui/list-view/list-view.d.ts +++ b/tns-core-modules/ui/list-view/list-view.d.ts @@ -63,6 +63,11 @@ export class ListView extends View { */ itemTemplateSelector: string | ((item: any, index: number, items: any) => string); + /** + * Item id generator + */ + itemIdGenerator: (item: any, index: number, items: any) => number; + /** * Gets or set the items separator line color of the ListView. */