From dcb96cbc0a12931555857709f84c7c55df2a6e8f Mon Sep 17 00:00:00 2001 From: Rossen Hristov Date: Wed, 27 May 2015 14:29:22 +0300 Subject: [PATCH] Fixed #222: ListPicker showing number of items in list --- .../tests/ui/list-picker/list-picker-tests.ts | 57 +++++++++++++++++++ ui/list-picker/list-picker.android.ts | 28 +++++---- 2 files changed, 74 insertions(+), 11 deletions(-) diff --git a/apps/tests/ui/list-picker/list-picker-tests.ts b/apps/tests/ui/list-picker/list-picker-tests.ts index 680c8314c..dc306036c 100644 --- a/apps/tests/ui/list-picker/list-picker-tests.ts +++ b/apps/tests/ui/list-picker/list-picker-tests.ts @@ -3,6 +3,7 @@ import helper = require("../helper"); import viewModule = require("ui/core/view"); import listPickerTestsNative = require("./list-picker-tests-native"); import pageModule = require("ui/page"); +import application = require("application"); // // # ListPicker @@ -196,4 +197,60 @@ export var testWhenSelectingAnItemNativelySelectedIndexIsUpdatedProperly = funct finally { helper.goBack(); } +} + +export var test_Android_MaxValueIsOneLessThanItemsCount = function () { + if (!application.android) { + return; + } + + helper.buildUIAndRunTest(_createListPicker(), function (views: Array) { + var listPicker = views[0]; + listPicker.items = ["One", "Two", "Three"]; + var expectedValue = listPicker.items.length - 1; + var actualValue = (listPicker).android.getMaxValue(); + TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + }); +} + +export var test_Android_WhenItemsAreEmptyNativeControlDoesNotShowZero = function () { + if (!application.android) { + return; + } + + helper.buildUIAndRunTest(_createListPicker(), function (views: Array) { + var listPicker = views[0]; + var expectedValue = ""; + var actualValue = (listPicker)._editText.getText().toString(); + TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + }); +} + +export var test_Android_WhenBoundToSingleElementArrayEditTextIsUpdatedProperly = function () { + if (!application.android) { + return; + } + + helper.buildUIAndRunTest(_createListPicker(), function (views: Array) { + var listPicker = views[0]; + listPicker.items = ["One"]; + var expectedValue = "One"; + var actualValue = (listPicker)._editText.getText().toString(); + TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + }); +} + +export var test_Android_WhenSelectedIndexChangesEditTextIsUpdatedProperly = function () { + if (!application.android) { + return; + } + + helper.buildUIAndRunTest(_createListPicker(), function (views: Array) { + var listPicker = views[0]; + listPicker.items = ["One", "Two"]; + listPicker.selectedIndex = 1; + var expectedValue = "Two"; + var actualValue = (listPicker)._editText.getText().toString(); + TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue); + }); } \ No newline at end of file diff --git a/ui/list-picker/list-picker.android.ts b/ui/list-picker/list-picker.android.ts index bf1b1f076..2cff77ccb 100644 --- a/ui/list-picker/list-picker.android.ts +++ b/ui/list-picker/list-picker.android.ts @@ -10,6 +10,7 @@ export class ListPicker extends common.ListPicker { private _android: android.widget.NumberPicker; private _valueChangedListener: android.widget.NumberPicker.OnValueChangeListener; private _formatter: android.widget.NumberPicker.Formatter; + private _editText: android.widget.EditText; get android(): android.widget.NumberPicker { return this._android; @@ -21,7 +22,6 @@ export class ListPicker extends common.ListPicker { public _createUI() { this._android = new android.widget.NumberPicker(this._context); - this._android.setMinValue(0); this._android.setDescendantFocusability(android.widget.NumberPicker.FOCUS_BLOCK_DESCENDANTS); var that = new WeakRef(this); @@ -36,7 +36,7 @@ export class ListPicker extends common.ListPicker { return this.owner._getItemAsString(index); } - return index.toString(); + return ""; } }); this._android.setFormatter(this._formatter); @@ -54,7 +54,15 @@ export class ListPicker extends common.ListPicker { }); this._android.setOnValueChangedListener(this._valueChangedListener); - this._fixDisappearingSelectedItem(); + //Fix disappearing selected item. + //HACK: http://stackoverflow.com/questions/17708325/android-numberpicker-with-formatter-does-not-format-on-first-rendering/26797732 + var mInputTextField = java.lang.Class.forName("android.widget.NumberPicker").getDeclaredField("mInputText"); + mInputTextField.setAccessible(true); + this._editText = mInputTextField.get(this._android); + this._editText.setFilters([]); + + // Since the Android NumberPicker has to always have at least one item, i.e. minValue=maxValue=value=0, we don't want this zero showing up when this.items is empty. + this._editText.setText(null); } public _onSelectedIndexPropertyChanged(data: dependencyObservable.PropertyChangeData) { @@ -77,7 +85,7 @@ export class ListPicker extends common.ListPicker { maxValue = 0; } else { - maxValue = data.newValue.length; + maxValue = data.newValue.length - 1; } this.android.setMaxValue(maxValue); @@ -85,13 +93,11 @@ export class ListPicker extends common.ListPicker { } this._updateSelectedIndexOnItemsPropertyChanged(data.newValue); - } - - private _fixDisappearingSelectedItem() { + + //Fix disappearing selected item. //HACK: http://stackoverflow.com/questions/17708325/android-numberpicker-with-formatter-does-not-format-on-first-rendering/26797732 - var mInputTextField = java.lang.Class.forName("android.widget.NumberPicker").getDeclaredField("mInputText"); - mInputTextField.setAccessible(true); - var mInputText = mInputTextField.get(this._android); - mInputText.setFilters([]); + if (this._editText) { + this._editText.setFilters([]); + } } } \ No newline at end of file