Files
NativeScript/ui/list-view/list-view-common.ts
Hristo Hristov b0cff20450 Manually applying CSS in removed and now it is done once per cell. (#2174)
* Manually applying CSS in removed and now it is done once per cell.
Clearing bindingContext is now done in refresh method instead of preparing cell.
Obsolete isScrolling property on ListView.
Removed android scroll listener.
Added test for nulling cells bindingContext.
Uncommented few tests and made them work.
Fixed android ListView eachChildView to return the wrapping StackLayout so that Unloading now works as expected.
onUnload method in view-common now raise unloaded only if item isLoaded=true.

* Fix navigation path
2016-05-25 14:03:45 +03:00

213 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 {
return this.items.getItem ? this.items.getItem(index) : this.items[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();
}
}