Невозможно изменить backgroundColor метки внутри TableViewRow onClick (android) - титановый аппселератор

Я пытаюсь обновить цвет фона метки внутри TableViewRow. Я использую View/Controller для строк, создавая их в коде и добавляя их в виде массива в TableView. Использование onClick TableViewRow и Label.setBackgroundColor() внутри контроллера TableViewRow.

ExampleRow.xml

<TableViewRow id="exampleRow" class="exampleClass" onClick="exampleClick">
    <Label id="exampleLabel" text="test" />
</TableViewRow>

ExampleRow.js

var test = 1;
function exampleClick(e) {
    if(test == 1) {
        $.exampleLabel.setBackgroundColor('#0f0');
        test = 0;
    } else {
        $.exampleLabel.setBackgroundColor('#fff');
        test = 1;
    }
}

ExamplePage.xml

<TableView id="exampleTable" />

ПримерPage.js

var tableViewRows = [];
for(var i = 0; i < 5; i++) {
    tableViewRows.push(
        Alloy.createController('exampleRow', {}).getView()
    );
}
$.exampleTable.setData(tableViewRows);

Проблема в том, что это не работает на первой странице, как только загружается приложение. Если я прокручиваю TableViewRows за пределы экрана и обратно, изменение цвета фона работает. Если появляется всплывающее окно, изменение фона работает. Но после первой загрузки приложения цвет фона не изменится. Это также работает, если мы используем appendRow для каждой строки, но это существенно медленнее.

Пример исправления appendRow:

for(var i = 0; i < 5; i++) {
    $.exampleTable.appendRow(
        Alloy.createController('exampleRow', {}).getView()
    );
}
  • добавление строк по отдельности иногда исправляет ошибку (не каждую строку), но для нашего списка требуется 5-8 секунд для отображения таблицы, а не ‹1 секунды с использованием setData*

Пример реального неработающего приложения:

example_not_working.gif

Пример работы реального приложения:

example_working.gif

Это происходит после отображения окна предупреждения или прокрутки строк вперед и назад на экране или использования appendRow для каждой строки

Способы, которые я пытался исправить (не удалось):

  • использование анимации
  • удаление метки, затем воссоздание и добавление новой метки в код
  • удаление класса из TableViewRow

Я использую Titanium SDK 5.0.2.GA и компилирую на Android 5.1.1.


person JJ Cantillon    schedule 28.10.2015    source источник
comment
срабатывает ли событие клика?   -  person Rene Pot    schedule 28.10.2015
comment
Да, событие клика срабатывает. Я могу увидеть это, добавив отладочное сообщение. SetBackgroundColor также срабатывает, и если приложение будет помещено в фоновый режим, а затем снова выведено на передний план, метка будет обновлена.   -  person JJ Cantillon    schedule 28.10.2015
comment
Итак, в основном цвет фона обновляется, а пользовательский интерфейс — нет, поэтому вы его не видите. Принудительный повторный рендеринг представления (прокрутка наружу и в поле зрения) действительно отражает правильный пользовательский интерфейс. Похоже, вы обнаружили здесь ошибку   -  person Rene Pot    schedule 28.10.2015


Ответы (1)


Попробуйте использовать событие click для tableView вместо tableViewRow:

<TableView onClick="yourTableViewClickEvent"></TableView>

а затем определите, какая логика будет выполняться внутри этого обратного вызова функции:

function yourTableViewClickEvent(e){
    // access selected row 
    var currentSelectedRow = e.row;
    // current selected Label we assume here that the row contain a label as first child (exactly what you have in your row definition
    var currentLabel = currentSelectedRow.children[0]
    // change label background color 
    currentSelectedRow.backgroundColor = "#0f0"
    // You can even (i know it is no good to do that :)) test if the color is white or #0f0 like so 
    if(currentSelectedRow.backgroundColor == "#fff")
        currentSelectedRow.backgroundColor = "#0f0"
    else 
        currentSelectedRow.backgroundColor = "#fff"
}
person LHIOUI    schedule 29.10.2015