Skip to content

Commit 4bcb984

Browse files
buuhuuHristo Hristov
authored andcommitted
Expose itemIdGenerator that can be used to generate unique ID for items on ListView (NativeScript#4964)
* fixed the context of the getItem() call in android's ListView adapter (NativeScript#4962) * added itemIdGenerator function to the list-view interface to allow delegating the creating of a unique id for an item to a consumer of the listview (NativeScript#4962)
1 parent 31d1019 commit 4bcb984

File tree

3 files changed

+22
-3
lines changed

3 files changed

+22
-3
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ export abstract class ListViewBase extends View implements ListViewDefinition {
2323
public static itemTapEvent = "itemTap";
2424
public static loadMoreItemsEvent = "loadMoreItems";
2525
// TODO: get rid of such hacks.
26-
public static knownFunctions = ["itemTemplateSelector"]; //See component-builder.ts isKnownFunction
26+
public static knownFunctions = ["itemTemplateSelector", "itemIdGenerator"]; //See component-builder.ts isKnownFunction
2727

28+
private _itemIdGenerator: (item: any, index: number, items: any) => number = (_item: any, index: number) => index;
2829
private _itemTemplateSelector: (item: any, index: number, items: any) => string;
2930
private _itemTemplateSelectorBindable = new Label();
3031
public _defaultTemplate: KeyedTemplate = {
@@ -72,6 +73,14 @@ export abstract class ListViewBase extends View implements ListViewDefinition {
7273
}
7374
}
7475

76+
get itemIdGenerator(): (item: any, index: number, items: any) => number {
77+
return this._itemIdGenerator;
78+
}
79+
80+
set itemIdGenerator(generatorFn: (item: any, index: number, items: any) => number) {
81+
this._itemIdGenerator = generatorFn;
82+
}
83+
7584
public refresh() {
7685
//
7786
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,14 +216,19 @@ function ensureListViewAdapterClass() {
216216
public getItem(i: number) {
217217
if (this.owner && this.owner.items && i < this.owner.items.length) {
218218
let getItem = (<ItemsSource>this.owner.items).getItem;
219-
return getItem ? getItem(i) : this.owner.items[i];
219+
return getItem ? getItem.call(this.owner.items, i) : this.owner.items[i];
220220
}
221221

222222
return null;
223223
}
224224

225225
public getItemId(i: number) {
226-
return long(i);
226+
let item = this.getItem(i);
227+
let id = i;
228+
if (this.owner && item && this.owner.items) {
229+
id = this.owner.itemIdGenerator(item, i, this.owner.items);
230+
}
231+
return long(id);
227232
}
228233

229234
public hasStableIds(): boolean {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ export class ListView extends View {
6363
*/
6464
itemTemplateSelector: string | ((item: any, index: number, items: any) => string);
6565

66+
/**
67+
* Item id generator
68+
*/
69+
itemIdGenerator: (item: any, index: number, items: any) => number;
70+
6671
/**
6772
* Gets or set the items separator line color of the ListView.
6873
*/

0 commit comments

Comments
 (0)