List view attaches with weakEventHandler

This commit is contained in:
vakrilov
2015-05-11 15:31:04 +03:00
parent 727145caeb
commit fd9ff189ba
3 changed files with 41 additions and 18 deletions

View File

@ -33,7 +33,7 @@ declare module "ui/core/weak-event-listener" {
/**
* A string to use as key for key value pair instance.
*/
key?: string;
key: string;
}
/**

View File

@ -1,4 +1,5 @@
import observable = require("data/observable");
import observableArray = require("data/observable-array");
import view = require("ui/core/view");
import proxy = require("ui/core/proxy");
import definition = require("ui/list-view");
@ -6,32 +7,22 @@ import dependencyObservable = require("ui/core/dependency-observable");
import builder = require("ui/builder");
import label = require("ui/label");
import color = require("color");
import weakEventListener = require("ui/core/weak-event-listener");
var ITEMS = "items";
var ITEMTEMPLATE = "itemTemplate";
var ISSCROLLING = "isScrolling";
var LISTVIEW = "ListView";
var ITEMSCHANGED = "_itemsChanged";
var CHANGE = "change";
var SEPARATORCOLOR = "separatorColor";
var WEAKEVENTKEY = "_observableArrayChanged";
export module knownTemplates {
export var itemTemplate = "itemTemplate";
}
function onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var listView = <definition.ListView>data.object;
var itemsChanged = listView[ITEMSCHANGED];
if (data.oldValue instanceof observable.Observable) {
(<observable.Observable>data.oldValue).off(CHANGE, itemsChanged);
}
if (data.newValue instanceof observable.Observable) {
(<observable.Observable>data.newValue).on(CHANGE, itemsChanged);
}
listView.refresh();
var listView = <ListView>data.object;
listView._onItemsPropertyChanged(data);
}
function onItemTemplatePropertyChanged(data: dependencyObservable.PropertyChangeData) {
@ -79,6 +70,7 @@ export class ListView extends view.View implements definition.ListView {
);
private _itemsChanged: (args: observable.EventData) => void;
private _weakEventListenerOptions: weakEventListener.WeakEventListenerOptions;
constructor() {
super();
@ -143,6 +135,28 @@ export class ListView extends view.View implements definition.ListView {
lbl.text = this._getDataItem(index) + "";
return lbl;
}
public _onItemsPropertyChanged(data: dependencyObservable.PropertyChangeData) {
if (data.oldValue instanceof observable.Observable && this._weakEventListenerOptions) {
weakEventListener.WeakEventListener.removeWeakEventListener(this._weakEventListenerOptions);
this._weakEventListenerOptions = null;
}
if (data.newValue instanceof observable.Observable) {
this._weakEventListenerOptions = {
targetWeakRef: new WeakRef(this),
sourceWeakRef: new WeakRef(data.newValue),
eventName: observableArray.ObservableArray.changeEvent,
handler: this._itemsChanged,
handlerContext: this,
key: WEAKEVENTKEY
};
weakEventListener.WeakEventListener.addWeakEventListener(this._weakEventListenerOptions);
}
this.refresh();
}
}
function getExports(instance: view.View): any {

View File

@ -151,6 +151,7 @@ export class ListView extends common.ListView {
private _delegate;
private _heights: Array<number>;
private _preparingCell: boolean = false;
private _isDataDirty: boolean = false;
constructor() {
super();
@ -172,6 +173,9 @@ export class ListView extends common.ListView {
public onLoaded() {
super.onLoaded();
if (this._isDataDirty) {
this.refresh();
}
this._ios.delegate = this._delegate;
}
@ -185,8 +189,13 @@ export class ListView extends common.ListView {
}
public refresh() {
this._ios.reloadData();
this.requestLayout();
if (this.isLoaded) {
this._ios.reloadData();
this.requestLayout();
this._isDataDirty = false;
} else {
this._isDataDirty = true;
}
}
public getHeight(index: number): number {
@ -242,7 +251,7 @@ export class ListView extends common.ListView {
cell.contentView.addSubview(view.ios);
this._addView(view);
}
this._prepareItem(view, indexPath.row);
cellHeight = this._layoutCell(view, indexPath);
}