Skip to content

Commit 8cbcc28

Browse files
author
Vasil Chimev
authored
Merge pull request NativeScript#3413 from NativeScript/zhecheva/separator-color-null-check
Getter in ListViewStyler for separatorColor
2 parents d821c39 + a29d743 commit 8cbcc28

File tree

2 files changed

+82
-37
lines changed

2 files changed

+82
-37
lines changed

tests/app/ui/list-view/list-view-tests.ts

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Label } from "ui/label";
99
import helper = require("../helper");
1010
import { Page } from "ui/page";
1111
import { View, KeyedTemplate } from "ui/core/view";
12+
import { separatorColorProperty } from "ui/styling/style";
1213

1314
// >> article-require-listview-module
1415
import listViewModule = require("ui/list-view");
@@ -698,6 +699,35 @@ export class ListViewTest extends testModule.UITest<listViewModule.ListView> {
698699
TKUnit.assert(weakRef.get(), weakRef.get() + " died prematurely!");
699700
}
700701

702+
public test_separatorColor_setInCSS_is_respected() {
703+
let listView = this.testView;
704+
let items = ["John", "Joshua", "Gregory"];
705+
listView.items = items;
706+
707+
helper.buildUIAndRunTest(listView, function (views) {
708+
let page = views[1];
709+
page.css = "ListView { separator-color: #FF0000; }";
710+
711+
TKUnit.assertEqual(listView.style.separatorColor.hex, "#FF0000", "separatorColor property");
712+
});
713+
}
714+
715+
public test_separatorColor_reset() {
716+
let listView = this.testView;
717+
let items = ["John", "Joshua", "Gregory"];
718+
listView.items = items;
719+
720+
helper.buildUIAndRunTest(listView, function (views) {
721+
let defaultsSeparatorColor = listView.style.separatorColor;
722+
723+
listView.style._setValue(separatorColorProperty, "#FF0000");
724+
TKUnit.assertEqual(listView.style.separatorColor.hex, "#FF0000", "set separatorColor property");
725+
726+
listView.style._resetValue(separatorColorProperty);
727+
TKUnit.assertEqual(listView.style.separatorColor, defaultsSeparatorColor, "reset separatorColor property");
728+
});
729+
}
730+
701731
private assertNoMemoryLeak(weakRef: WeakRef<listViewModule.ListView>) {
702732
this.tearDown();
703733
TKUnit.waitUntilReady(() => {
@@ -785,7 +815,7 @@ export class ListViewTest extends testModule.UITest<listViewModule.ListView> {
785815
TKUnit.wait(0.1);
786816

787817
let firstNativeElementText = this.getTextFromNativeElementAt(listView, 0);
788-
818+
789819
TKUnit.assertEqual(firstNativeElementText, "default", "first element text");
790820
}
791821

@@ -820,19 +850,19 @@ export class ListViewTest extends testModule.UITest<listViewModule.ListView> {
820850
public test_ItemTemplateSelector_ItemTemplatesAreCorrectlyParsedFromString() {
821851
let listView = this.testView;
822852
listView.itemTemplates = this._itemTemplatesString;
823-
853+
824854
let itemTemplatesArray = <any>listView.itemTemplates;
825855

826856
TKUnit.assertEqual(itemTemplatesArray.length, 3, "itemTemplates array length");
827-
857+
828858
let template0 = <KeyedTemplate>itemTemplatesArray[0];
829859
TKUnit.assertEqual(template0.key, "red", "template0.key");
830860
TKUnit.assertEqual((<Label>template0.createView()).text, "red", "template0 created view text");
831-
861+
832862
let template1 = <KeyedTemplate>itemTemplatesArray[1];
833863
TKUnit.assertEqual(template1.key, "green", "template1.key");
834864
TKUnit.assertEqual((<Label>template1.createView()).text, "green", "template1 created view text");
835-
865+
836866
let template2 = <KeyedTemplate>itemTemplatesArray[2];
837867
TKUnit.assertEqual(template2.key, "blue", "template2.key");
838868
TKUnit.assertEqual((<Label>template2.createView()).text, "blue", "template2 created view text");
@@ -849,7 +879,7 @@ export class ListViewTest extends testModule.UITest<listViewModule.ListView> {
849879

850880
let firstNativeElementText = this.getTextFromNativeElementAt(listView, 0);
851881
let secondNativeElementText = this.getTextFromNativeElementAt(listView, 1);
852-
882+
853883
TKUnit.assertEqual(firstNativeElementText, "red", "first element text");
854884
TKUnit.assertEqual(secondNativeElementText, "green", "second element text");
855885
}
@@ -864,23 +894,23 @@ export class ListViewTest extends testModule.UITest<listViewModule.ListView> {
864894
TKUnit.wait(0.05);
865895

866896
// Forward
867-
for(let i = 0, length = listView.items.length; i < length; i++){
897+
for (let i = 0, length = listView.items.length; i < length; i++) {
868898
listView.scrollToIndex(i);
869899
TKUnit.wait(0.05);
870900
}
871-
901+
872902
// Back
873-
for(let i = listView.items.length - 1; i >= 0; i--){
903+
for (let i = listView.items.length - 1; i >= 0; i--) {
874904
listView.scrollToIndex(i);
875905
TKUnit.wait(0.05);
876906
}
877907

878-
if (listView.android){
908+
if (listView.android) {
879909
//(<any>listView)._dumpRealizedTemplates();
880910
let realizedItems = <Map<android.view.View, View>>(<any>listView)._realizedItems;
881911
TKUnit.assertTrue(realizedItems.size <= 6, 'Realized items must be 6 or less');
882-
883-
let realizedTemplates = <Map<string, Map<android.view.View, View>>>(<any>listView)._realizedTemplates;
912+
913+
let realizedTemplates = <Map<string, Map<android.view.View, View>>>(<any>listView)._realizedTemplates;
884914
TKUnit.assertEqual(realizedTemplates.size, 3, 'Realized templates');
885915
TKUnit.assertTrue(realizedTemplates.get("red").size <= 2, 'Red realized items must be 2 or less');
886916
TKUnit.assertTrue(realizedTemplates.get("green").size <= 2, 'Green realized items must be 2 or less');
@@ -899,7 +929,7 @@ export class ListViewTest extends testModule.UITest<listViewModule.ListView> {
899929
<Label text='blue' style.backgroundColor='blue' minHeight='100' maxHeight='100'/>
900930
</template>
901931
`;
902-
932+
903933
private static generateItemsForMultipleTemplatesTests(count: number): Array<Item> {
904934
let items = new Array<Item>();
905935
for (let i = 0; i < count; i++) {

tns-core-modules/ui/list-view/list-view.android.ts

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import stackLayout = require("ui/layouts/stack-layout");
55
import proxy = require("ui/core/proxy");
66
import dependencyObservable = require("ui/core/dependency-observable");
77
import definition = require("ui/list-view");
8-
import {ProxyViewContainer} from "ui/proxy-view-container";
8+
import { ProxyViewContainer } from "ui/proxy-view-container";
99
import * as layoutBase from "ui/layouts/layout-base";
1010
import * as colorModule from "color";
1111
import { separatorColorProperty, registerHandler, Styler, StylePropertyChangedHandler } from "ui/styling/style";
@@ -43,7 +43,7 @@ function onSeparatorColorPropertyChanged(data: dependencyObservable.PropertyChan
4343
export class ListView extends common.ListView {
4444
private _androidViewId: number = -1;
4545
private _android: android.widget.ListView;
46-
public _realizedItems = new Map<android.view.View, viewModule.View>();
46+
public _realizedItems = new Map<android.view.View, viewModule.View>();
4747
public _realizedTemplates = new Map<string, Map<android.view.View, viewModule.View>>();
4848

4949
public _createUI() {
@@ -82,12 +82,12 @@ export class ListView extends common.ListView {
8282
}
8383

8484
// clear bindingContext when it is not observable because otherwise bindings to items won't reevaluate
85-
this._realizedItems.forEach((view, nativeView, map) => {
85+
this._realizedItems.forEach((view, nativeView, map) => {
8686
if (!(view.bindingContext instanceof observable.Observable)) {
8787
view.bindingContext = null;
8888
}
8989
});
90-
90+
9191
(<android.widget.BaseAdapter>this.android.getAdapter()).notifyDataSetChanged();
9292
}
9393

@@ -120,16 +120,16 @@ export class ListView extends common.ListView {
120120
});
121121
}
122122

123-
public _dumpRealizedTemplates(){
124-
console.log(`Realized Templates:`);
123+
public _dumpRealizedTemplates() {
124+
console.log(`Realized Templates:`);
125125
this._realizedTemplates.forEach((value, index, map) => {
126126
console.log(`\t${index}:`);
127127
value.forEach((value, index, map) => {
128128
console.log(`\t\t${index.hashCode()}: ${value}`);
129129
});
130130
});
131-
console.log(`Realized Items Size: ${this._realizedItems.size}`);
132-
}
131+
console.log(`Realized Items Size: ${this._realizedItems.size}`);
132+
}
133133

134134
private clearRealizedCells(): void {
135135
// clear the cache
@@ -148,16 +148,16 @@ export class ListView extends common.ListView {
148148
}
149149

150150
public _onItemTemplatesPropertyChanged(data: dependencyObservable.PropertyChangeData) {
151-
this._itemTemplatesInternal = new Array<viewModule.KeyedTemplate>(this._defaultTemplate);
152-
if (data.newValue){
151+
this._itemTemplatesInternal = new Array<viewModule.KeyedTemplate>(this._defaultTemplate);
152+
if (data.newValue) {
153153
this._itemTemplatesInternal = this._itemTemplatesInternal.concat(data.newValue);
154154
}
155-
156-
if (this.android){
155+
156+
if (this.android) {
157157
ensureListViewAdapterClass();
158158
this.android.setAdapter(new ListViewAdapterClass(this));
159159
}
160-
160+
161161
this.refresh();
162162
}
163163
}
@@ -200,18 +200,18 @@ function ensureListViewAdapterClass() {
200200
}
201201

202202
public getViewTypeCount() {
203-
return this._listView._itemTemplatesInternal.length;
203+
return this._listView._itemTemplatesInternal.length;
204204
}
205205

206206
public getItemViewType(index: number) {
207207
let template = this._listView._getItemTemplate(index);
208208
let itemViewType = this._listView._itemTemplatesInternal.indexOf(template);
209209
return itemViewType;
210210
}
211-
211+
212212
public getView(index: number, convertView: android.view.View, parent: android.view.ViewGroup): android.view.View {
213213
//this._listView._dumpRealizedTemplates();
214-
214+
215215
if (!this._listView) {
216216
return null;
217217
}
@@ -224,9 +224,9 @@ function ensureListViewAdapterClass() {
224224
// Recycle an existing view or create a new one if needed.
225225
let template = this._listView._getItemTemplate(index);
226226
let view: viewModule.View;
227-
if (convertView){
227+
if (convertView) {
228228
view = this._listView._realizedTemplates.get(template.key).get(convertView);
229-
if (!view){
229+
if (!view) {
230230
throw new Error(`There is no entry with key '${convertView}' in the realized views cache for template with key'${template.key}'.`);
231231
}
232232
}
@@ -273,10 +273,10 @@ function ensureListViewAdapterClass() {
273273

274274
// Cache the view for recycling
275275
let realizedItemsForTemplateKey = this._listView._realizedTemplates.get(template.key);
276-
if (!realizedItemsForTemplateKey){
276+
if (!realizedItemsForTemplateKey) {
277277
realizedItemsForTemplateKey = new Map<android.view.View, viewModule.View>();
278278
this._listView._realizedTemplates.set(template.key, realizedItemsForTemplateKey);
279-
}
279+
}
280280
realizedItemsForTemplateKey.set(convertView, args.view);
281281
this._listView._realizedItems.set(convertView, args.view);
282282
}
@@ -290,22 +290,37 @@ function ensureListViewAdapterClass() {
290290

291291
export class ListViewStyler implements Styler {
292292
// separator-color
293+
private static getSeparatorColorProperty(view: viewModule.View): any {
294+
let listView = <android.widget.ListView>view._nativeView;
295+
return listView.getDivider();
296+
}
297+
293298
private static setSeparatorColorProperty(view: viewModule.View, newValue: any) {
294299
let listView = <android.widget.ListView>view._nativeView;
295-
listView.setDivider(new android.graphics.drawable.ColorDrawable(newValue));
300+
301+
if (newValue instanceof android.graphics.drawable.Drawable) {
302+
listView.setDivider(newValue);
303+
} else {
304+
listView.setDivider(new android.graphics.drawable.ColorDrawable(newValue));
305+
}
296306
listView.setDividerHeight(1);
297307
}
298308

299309
private static resetSeparatorColorProperty(view: viewModule.View, nativeValue: any) {
300310
let listView = <android.widget.ListView>view._nativeView;
301-
listView.setDivider(new android.graphics.drawable.ColorDrawable(nativeValue));
302-
listView.setDividerHeight(1);
311+
312+
if (nativeValue instanceof android.graphics.drawable.Drawable) {
313+
listView.setDivider(nativeValue);
314+
} else {
315+
listView.setDivider(new android.graphics.drawable.ColorDrawable(nativeValue));
316+
}
303317
}
304318

305319
public static registerHandlers() {
306320
registerHandler(separatorColorProperty, new StylePropertyChangedHandler(
307321
ListViewStyler.setSeparatorColorProperty,
308-
ListViewStyler.resetSeparatorColorProperty), "ListView");
322+
ListViewStyler.resetSeparatorColorProperty,
323+
ListViewStyler.getSeparatorColorProperty), "ListView");
309324
}
310325
}
311326

0 commit comments

Comments
 (0)