mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-16 11:42:04 +08:00

Added View.isLayoutRequired - to check if Layout call is needed after a measure call. Use in list-view. Measure pass now get all its properties from nativeLayoutParams property instead of using instance dependency properties (e.g. perf improvement). List-view now layouts cells only if there is need to. List-view now measure rows with the specified rowHeight.
214 lines
6.0 KiB
TypeScript
214 lines
6.0 KiB
TypeScript
import observable = require("data/observable");
|
|
import view = require("ui/core/view");
|
|
import proxy = require("ui/core/proxy");
|
|
import definition = require("ui/list-view");
|
|
import dependencyObservable = require("ui/core/dependency-observable");
|
|
import color = require("color");
|
|
import * as builderModule from "ui/builder";
|
|
import * as labelModule from "ui/label";
|
|
import * as observableArrayModule from "data/observable-array";
|
|
import * as weakEventsModule from "ui/core/weak-event-listener";
|
|
|
|
var builder: typeof builderModule;
|
|
function ensureBuilder() {
|
|
if (!builder) {
|
|
builder = require("ui/builder");
|
|
}
|
|
}
|
|
|
|
var label: typeof labelModule;
|
|
function ensureLabel() {
|
|
if (!label) {
|
|
label = require("ui/label");
|
|
}
|
|
}
|
|
|
|
var observableArray: typeof observableArrayModule;
|
|
function ensureObservableArray() {
|
|
if (!observableArray) {
|
|
observableArray = require("data/observable-array");
|
|
}
|
|
}
|
|
|
|
var weakEvents: typeof weakEventsModule;
|
|
function ensureWeakEvents() {
|
|
if (!weakEvents) {
|
|
weakEvents = require("ui/core/weak-event-listener");
|
|
}
|
|
}
|
|
|
|
var ITEMS = "items";
|
|
var ITEMTEMPLATE = "itemTemplate";
|
|
var ISSCROLLING = "isScrolling";
|
|
var LISTVIEW = "ListView";
|
|
var SEPARATORCOLOR = "separatorColor";
|
|
var ROWHEIGHT = "rowHeight";
|
|
|
|
export module knownTemplates {
|
|
export var itemTemplate = "itemTemplate";
|
|
}
|
|
|
|
function onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) {
|
|
var listView = <ListView>data.object;
|
|
listView._onItemsPropertyChanged(data);
|
|
}
|
|
|
|
function onItemTemplatePropertyChanged(data: dependencyObservable.PropertyChangeData) {
|
|
var listView = <definition.ListView>data.object;
|
|
listView.refresh();
|
|
}
|
|
|
|
function onRowHeightPropertyChanged(data: dependencyObservable.PropertyChangeData) {
|
|
var listView = <ListView>data.object;
|
|
listView._onRowHeightPropertyChanged(data);
|
|
}
|
|
|
|
export class ListView extends view.View implements definition.ListView {
|
|
public static itemLoadingEvent = "itemLoading";
|
|
public static itemTapEvent = "itemTap";
|
|
public static loadMoreItemsEvent = "loadMoreItems";
|
|
|
|
public static separatorColorProperty = new dependencyObservable.Property(
|
|
SEPARATORCOLOR,
|
|
LISTVIEW,
|
|
new proxy.PropertyMetadata(undefined));
|
|
|
|
public static itemsProperty = new dependencyObservable.Property(
|
|
ITEMS,
|
|
LISTVIEW,
|
|
new proxy.PropertyMetadata(
|
|
undefined,
|
|
dependencyObservable.PropertyMetadataSettings.AffectsLayout,
|
|
onItemsPropertyChanged
|
|
)
|
|
);
|
|
|
|
public static itemTemplateProperty = new dependencyObservable.Property(
|
|
ITEMTEMPLATE,
|
|
LISTVIEW,
|
|
new proxy.PropertyMetadata(
|
|
undefined,
|
|
dependencyObservable.PropertyMetadataSettings.AffectsLayout,
|
|
onItemTemplatePropertyChanged
|
|
)
|
|
);
|
|
|
|
public static isScrollingProperty = new dependencyObservable.Property(
|
|
ISSCROLLING,
|
|
LISTVIEW,
|
|
new proxy.PropertyMetadata(
|
|
false,
|
|
dependencyObservable.PropertyMetadataSettings.None
|
|
)
|
|
);
|
|
|
|
public static rowHeightProperty = new dependencyObservable.Property(
|
|
ROWHEIGHT,
|
|
LISTVIEW,
|
|
new proxy.PropertyMetadata(
|
|
-1,
|
|
dependencyObservable.PropertyMetadataSettings.AffectsLayout,
|
|
onRowHeightPropertyChanged
|
|
)
|
|
);
|
|
|
|
get items(): any {
|
|
return this._getValue(ListView.itemsProperty);
|
|
}
|
|
set items(value: any) {
|
|
this._setValue(ListView.itemsProperty, value);
|
|
}
|
|
|
|
get itemTemplate(): string | view.Template {
|
|
return this._getValue(ListView.itemTemplateProperty);
|
|
}
|
|
set itemTemplate(value: string | view.Template) {
|
|
this._setValue(ListView.itemTemplateProperty, value);
|
|
}
|
|
|
|
get isScrolling(): boolean {
|
|
return false;
|
|
}
|
|
set isScrolling(value: boolean) {
|
|
// Do nothing.
|
|
}
|
|
|
|
get separatorColor(): color.Color {
|
|
return this._getValue(ListView.separatorColorProperty);
|
|
}
|
|
set separatorColor(value: color.Color) {
|
|
this._setValue(ListView.separatorColorProperty,
|
|
value instanceof color.Color ? value : new color.Color(<any>value));
|
|
}
|
|
|
|
get rowHeight(): number {
|
|
return this._getValue(ListView.rowHeightProperty);
|
|
}
|
|
set rowHeight(value: number) {
|
|
this._setValue(ListView.rowHeightProperty, value);
|
|
}
|
|
|
|
public refresh() {
|
|
//
|
|
}
|
|
|
|
public scrollToIndex(index: number) {
|
|
//
|
|
}
|
|
|
|
public _getItemTemplateContent(index: number): view.View {
|
|
ensureBuilder();
|
|
|
|
var v;
|
|
if (this.itemTemplate && this.items) {
|
|
v = builder.parse(this.itemTemplate, this);
|
|
}
|
|
|
|
return v;
|
|
}
|
|
|
|
public _prepareItem(item: view.View, index: number) {
|
|
if (item) {
|
|
item.bindingContext = this._getDataItem(index);
|
|
}
|
|
}
|
|
|
|
private _getDataItem(index: number): any {
|
|
let thisItems = this.items;
|
|
return thisItems.getItem ? thisItems.getItem(index) : thisItems[index];
|
|
}
|
|
|
|
public _getDefaultItemContent(index: number): view.View {
|
|
ensureLabel();
|
|
|
|
var lbl = new label.Label();
|
|
lbl.bind({
|
|
targetProperty: "text",
|
|
sourceProperty: "$value"
|
|
});
|
|
return lbl;
|
|
}
|
|
|
|
public _onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) {
|
|
ensureObservableArray();
|
|
ensureWeakEvents();
|
|
|
|
if (data.oldValue instanceof observable.Observable) {
|
|
weakEvents.removeWeakEventListener(data.oldValue, observableArray.ObservableArray.changeEvent, this._onItemsChanged, this);
|
|
}
|
|
|
|
if (data.newValue instanceof observable.Observable) {
|
|
weakEvents.addWeakEventListener(data.newValue, observableArray.ObservableArray.changeEvent, this._onItemsChanged, this);
|
|
}
|
|
|
|
this.refresh();
|
|
}
|
|
|
|
private _onItemsChanged(args: observable.EventData) {
|
|
this.refresh();
|
|
}
|
|
|
|
public _onRowHeightPropertyChanged(data: dependencyObservable.PropertyChangeData) {
|
|
this.refresh();
|
|
}
|
|
} |