无法更改TableViewRow onClick(android)中的标签的backgroundColor - appcelerator钛

时间:2015-10-28 12:14:06

标签: android titanium tableview appcelerator titanium-alloy

我正在尝试更新TableViewRow中Label的背景颜色。我正在为行使用View / Controller,在代码中创建它们并将它们作为数组附加到TableView。在TableViewRow控制器中使用TableViewRow和Label.setBackgroundColor()的onClick。

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上进行编译。

1 个答案:

答案 0 :(得分:2)

尝试使用tableView的click事件而不是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"
}