FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Manually applying CSS is removed and now it is done once per cell. by hshristov · Pull Request #2174 · NativeScript/NativeScript · GitHub

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension .ts  (6) All 1 file type selected
Viewed files
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Unified
Split
Hide whitespace
Diff view
Unified
Split
Hide whitespace
231 changes: 130 additions & 101 deletions apps/tests/ui/list-view/list-view-tests.ts

Large diffs are not rendered by default.

11 changes: 6 additions & 5 deletions ui/core/view-common.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -571,12 +571,13 @@ export class View extends ProxyObject implements definition.View {

public _unloadEachChildView() {
if (this._childrenCount > 0) {
// iterate all children and call onLoaded on them first
var eachChild = function (child: View): boolean {
child.onUnloaded();
this._eachChildView((child) => {
if (child.isLoaded) {
child.onUnloaded();
}

return true;
}
this._eachChildView(eachChild);
});
}
}

Expand Down
15 changes: 3 additions & 12 deletions ui/list-view/list-view-common.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -127,10 +127,10 @@ export class ListView extends view.View implements definition.ListView {
}

get isScrolling(): boolean {
return this._getValue(ListView.isScrollingProperty);
return false;
}
set isScrolling(value: boolean) {
this._setValue(ListView.isScrollingProperty, value);
// Do nothing.
}

get separatorColor(): color.Color {
Expand Down Expand Up @@ -169,12 +169,7 @@ export class ListView extends view.View implements definition.ListView {

public _prepareItem(item: view.View, index: number) {
if (item) {
var dataItem = this._getDataItem(index);
if (!(dataItem instanceof observable.Observable)) {
item.bindingContext = null;
}
item.bindingContext = dataItem;
item._inheritProperties(this);
item.bindingContext = this._getDataItem(index);
}
}

Expand Down Expand Up @@ -215,8 +210,4 @@ export class ListView extends view.View implements definition.ListView {
public _onRowHeightPropertyChanged(data: dependencyObservable.PropertyChangeData) {
this.refresh();
}

public _propagateInheritableProperties(view: view.View) {
// do not get binding context from parent when adding items, since the binding context of the items will be different.
}
}
143 changes: 51 additions & 92 deletions ui/list-view/list-view.android.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -5,27 +5,25 @@ import stackLayout = require("ui/layouts/stack-layout");
import proxy = require("ui/core/proxy");
import dependencyObservable = require("ui/core/dependency-observable");
import definition = require("ui/list-view");
import utils = require("utils/utils")
import {ProxyViewContainer} from "ui/proxy-view-container";
import * as layoutBase from "ui/layouts/layout-base";
import * as colorModule from "color";

var color: typeof colorModule;
let color: typeof colorModule;
function ensureColor() {
if (!color) {
color = require("color");
}
}

var ITEMLOADING = common.ListView.itemLoadingEvent;
var LOADMOREITEMS = common.ListView.loadMoreItemsEvent;
var ITEMTAP = common.ListView.itemTapEvent;
var REALIZED_INDEX = "realizedIndex";
let ITEMLOADING = common.ListView.itemLoadingEvent;
let LOADMOREITEMS = common.ListView.loadMoreItemsEvent;
let ITEMTAP = common.ListView.itemTapEvent;

global.moduleMerge(common, exports);

function onSeparatorColorPropertyChanged(data: dependencyObservable.PropertyChangeData) {
var bar = <ListView>data.object;
let bar = <ListView>data.object;
if (!bar.android) {
return;
}
Expand All @@ -42,9 +40,9 @@ function onSeparatorColorPropertyChanged(data: dependencyObservable.PropertyChan
(<proxy.PropertyMetadata>common.ListView.separatorColorProperty.metadata).onSetNativeValue = onSeparatorColorPropertyChanged;

export class ListView extends common.ListView {
private _android: android.widget.ListView;
public _realizedItems = {};
private _androidViewId: number = -1;
private _android: android.widget.ListView;
public _realizedItems = new Map<android.view.View, viewModule.View>();

public _createUI() {
this._android = new android.widget.ListView(this._context);
Expand All @@ -59,42 +57,10 @@ export class ListView extends common.ListView {
ensureListViewAdapterClass();
this.android.setAdapter(new ListViewAdapterClass(this));

var that = new WeakRef(this);

// TODO: This causes many marshalling calls, rewrite in Java and generate bindings
this.android.setOnScrollListener(new android.widget.AbsListView.OnScrollListener(<utils.Owned & android.widget.AbsListView.IOnScrollListener>{
onScrollStateChanged: function (view: android.widget.AbsListView, scrollState: number) {
var owner: ListView = this.owner;
if (!owner) {
return;
}

if (scrollState === android.widget.AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
owner._setValue(common.ListView.isScrollingProperty, false);
owner._notifyScrollIdle();
} else {
owner._setValue(common.ListView.isScrollingProperty, true);
}
},
onScroll: function (view: android.widget.AbsListView, firstVisibleItem: number, visibleItemCount: number, totalItemCount: number) {
var owner: ListView = this.owner;
if (!owner) {
return;
}

if (totalItemCount > 0 && firstVisibleItem + visibleItemCount === totalItemCount) {
owner.notify(<observable.EventData>{ eventName: LOADMOREITEMS, object: owner });
}
},

get owner() {
return that.get();
}
}));

let that = new WeakRef(this);
this.android.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener({
onItemClick: function (parent: any, convertView: android.view.View, index: number, id: number) {
var owner = that.get();
let owner = that.get();
if (owner) {
owner.notify({ eventName: ITEMTAP, object: owner, index: index, view: owner._getRealizedView(convertView, index) });
}
Expand All @@ -111,6 +77,13 @@ export class ListView extends common.ListView {
return;
}

// clear bindingContext when it is not observable because otherwise bindings to items won't reevaluate
this._realizedItems.forEach((view, nativeView, map) => {
if (!(view.bindingContext instanceof observable.Observable)) {
view.bindingContext = null;
}
});

(<android.widget.BaseAdapter>this.android.getAdapter()).notifyDataSetChanged();
}

Expand All @@ -122,67 +95,48 @@ export class ListView extends common.ListView {

public _onDetached(force?: boolean) {
super._onDetached(force);

// clear the cache
var keys = Object.keys(this._realizedItems);
var i;
var length = keys.length;
var view: viewModule.View;
var key;

for (i = 0; i < length; i++) {
key = keys[i];
view = this._realizedItems[key];
view.parent._removeView(view);
delete this._realizedItems[key];
}
this.clearRealizedCells();
}

get _childrenCount(): number {
let keys = Object.keys(this._realizedItems);
return keys.length;
return this._realizedItems.size;
}

public _eachChildView(callback: (child: viewModule.View) => boolean): void {
let keys = Object.keys(this._realizedItems);
let length = keys.length;
for (let i = 0; i < length; i++) {
let key = keys[i];
let view: viewModule.View = this._realizedItems[key];
callback(view);
}
this._realizedItems.forEach((view, nativeView, map) => {
if (view.parent instanceof ListView) {
callback(view);
}
else {
callback(view.parent);
}
});
}

public _getRealizedView(convertView: android.view.View, index: number) {
if (!convertView) {
return this._getItemTemplateContent(index);
}

return this._realizedItems[convertView.hashCode()];
return this._realizedItems.get(convertView);
}

public _notifyScrollIdle() {
var keys = Object.keys(this._realizedItems);
var i;
var length = keys.length;
var view: viewModule.View;
var key;
for (i = 0; i < length; i++) {
key = keys[i];
view = this._realizedItems[key];
if (view[REALIZED_INDEX] < this.items.length) {
this.notify({
eventName: ITEMLOADING,
object: this,
index: view[REALIZED_INDEX],
view: view
});
private clearRealizedCells(): void {
// clear the cache
this._realizedItems.forEach((view, nativeView, map) => {
// This is to clear the StackLayout that is used to wrap non LayoutBase & ProxyViewContainer instances.
if (!(view.parent instanceof ListView)) {
this._removeView(view.parent);
}
}

view.parent._removeView(view);
});

this._realizedItems.clear();
}
}

var ListViewAdapterClass;
let ListViewAdapterClass;
function ensureListViewAdapterClass() {
if (ListViewAdapterClass) {
return;
Expand Down Expand Up @@ -224,12 +178,18 @@ function ensureListViewAdapterClass() {
return null;
}

var view = this._listView._getRealizedView(convertView, index);
var args = <definition.ItemEventData>{
let totalItemCount = this._listView.items ? this._listView.items.length : 0;
if (index === (totalItemCount - 1)) {
this._listView.notify({ eventName: LOADMOREITEMS, object: this._listView });
}

let view = this._listView._getRealizedView(convertView, index);
let args: definition.ItemEventData = {
eventName: ITEMLOADING, object: this._listView, index: index, view: view,
android: parent,
ios: undefined
};

this._listView.notify(args);

if (!args.view) {
Expand All @@ -243,6 +203,7 @@ function ensureListViewAdapterClass() {
else {
args.view.height = Number.NaN;
}

this._listView._prepareItem(args.view, index);
if (!args.view.parent) {
// Proxy containers should not get treated as layouts.
Expand All @@ -252,22 +213,20 @@ function ensureListViewAdapterClass() {
this._listView._addView(args.view);
convertView = args.view.android;
} else {
var sp = new stackLayout.StackLayout();
let sp = new stackLayout.StackLayout();
sp.addChild(args.view);
this._listView._addView(sp);

convertView = sp.android;
}
}

this._listView._realizedItems[convertView.hashCode()] = args.view;
// cache the realized index (used to raise the ItemLoading event upon scroll stop)
args.view[REALIZED_INDEX] = index;
this._listView._realizedItems.set(convertView, args.view);
}

return convertView;
}
}

ListViewAdapterClass = ListViewAdapter;
}
}
2 changes: 2 additions & 0 deletions ui/list-view/list-view.d.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ declare module "ui/list-view" {
/**
* Represents the observable property backing the isScrolling property of each ListView instance.
*/
@Deprecated // in 2.1
public static isScrollingProperty: dependencyObservable.Property;

/**
Expand All @@ -67,6 +68,7 @@ declare module "ui/list-view" {
/**
* Gets a value indicating whether the ListView is currently scrolling.
*/
@Deprecated // in 2.1
isScrolling: boolean;

/**
Expand Down
Loading

Back | FazBrowse Home | New Git URL