Expose itemIdGenerator that can be used to generate unique ID for items on ListView (#4964)

* fixed the context of the getItem() call in android's ListView adapter (#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 (#4962)
This commit is contained in:
Dirk Rudolph
2017-12-05 10:53:32 +01:00
committed by Hristo Hristov
parent 31d10192f5
commit 4bcb9840c1
3 changed files with 22 additions and 3 deletions

View File

@@ -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() {
//
}

View File

@@ -216,14 +216,19 @@ function ensureListViewAdapterClass() {
public getItem(i: number) {
if (this.owner && this.owner.items && i < this.owner.items.length) {
let getItem = (<ItemsSource>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 {

View File

@@ -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.
*/