Не може да се промени backgroundColor на етикет в TableViewRow onClick (android) - appcelerator titanium

Опитвам се да актуализирам цвета на фона на етикет вътре в 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" />

ExamplePage.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)


Опитайте се да използвате събитие за кликване на 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