Titanium - 不会忽略对TableViewRow自定义属性所做的更改

时间:2013-06-26 22:42:23

标签: android properties titanium tableview appcelerator-mobile

我正在使用Titanium SDK 2.1.3并针对iOS 6.1和Android 4.0进行开发。

我的应用程序有一个TableView,每个TableViewRow代表一个文件并且有一个名为lockedStatus的自定义属性,可以是true或false,当单击一行时,根据lockedStatus的值,打开一个窗口指示状态行的元素。在这个窗口中,我可以将lockedStatus从true修改为false,反之亦然。

我遇到的问题是,在Android中,对此属性所做的更改将被忽略,除非完全强制应用程序停止,这在iOS中不会发生。

要更改窗口中的lockedStatus值,我会触发如下事件:

Ti.App.fireEvent('updateLockedStatus', {
    lockedStatus : true //this can be true or false
});

然后听众是这样的:

Ti.App.addEventListener('updateLockedStatus', function(e){
    var rows = table.data[0].rows;
    for (var i = 0; i < rows.length; i++) //iterate through the rows to look for the file
    {
        if (rows[i].fileID == currentlyEditingFile)
        {
            rows[i].updateLockedStatus(e.lockedStatus);
            files[currentlyEditingFile].lockedStatus = e.lockedStatus; //update the file lockedStatus
            rows[i].fileObject = files[currentlyEditingFile];
            saveFilesToDatabase();
        }
    }   
});

每行都使用updateLockedStatus函数生成,该函数具有以下定义:

row.updateLockedStatus = function(lockedStatus)
{
    row.lockedStatus = lockedStatus;
}

saveFilesToDatabase函数如下所示:

function saveFilesToDatabase()
{

    var tempFilesArray = [];

    for(var i=0;i<filesIds.length;i++)
    {
        tempFilesArray.push(files[filesIds[i]]);
    }

    Ti.App.Properties.setString('filesApp', JSON.stringify(tempFilesArray)); //save the file values in the application properties
}

我被忽略的意思是当我退出窗口并返回带有文件表的视图时,如果我再次点击我刚修改的文件,窗口将被打开,好像没有做任何改动一样

如何强制更新TableView中的所有内容?在iOS中没有问题,但使用Android时,除非我关闭应用程序,否则不会更新。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

尝试使用Ti.API.fireEvent&amp; Ti.API.addEventListener代替Ti.App

答案 1 :(得分:0)

这样做时你会小心:

  

每行都使用updateLockedStatus函数生成,该函数具有以下定义:

row.updateLockedStatus = function(lockedStatus)
{
    row.lockedStatus = lockedStatus;
};

如果将上面的代码放在一个循环中,那么执行 row.updateLockedStatus 可能只影响最后一行,因为 row 变量被重用并且仅包含在最后一行最后一个对象。看看this

您只需使用此代码:

row.updateLockedStatus = function(lockedStatus)
{
    this.lockedStatus = lockedStatus;  // this is the current row
};

或使用闭包,类似的东西:

row.updateLockedStatus = (function(r){

    return function(lockedStatus){

        r.lockedStatus = lockedStatus;   // r is the current row

    };

})(row);

本地 r 变量应保留右行对象。

顺便说一句,当您使用Ti.App监听事件时,您应该使用变量处理程序。而不是这样做:

Ti.App.addEventListener('updateLockedStatus', function(e){

使用这种方式

var updateLockedStatusHandler = function(e){
    //...
};

Ti.App.addEventListener('updateLockedStatus', updateLockedStatusHandler);

然后,这可能有助于删除处理程序并避免潜在的内存泄漏:

Ti.App.removeEventListener('updateLockedStatus', updateLockedStatusHandler);