Android 钛-对TableViewRow自定义属性所做的更改将被忽略

Android 钛-对TableViewRow自定义属性所做的更改将被忽略,android,properties,titanium,tableview,appcelerator-mobile,Android,Properties,Titanium,Tableview,Appcelerator Mobile,我正在使用Tianium SDK 2.1.3,并为iOS 6.1和Android 4.0进行开发 我的应用程序有一个TableView,每个TableViewRow代表一个文件,并有一个名为lockedStatus的自定义属性,该属性可以为true或false。单击一行时,根据lockedStatus的值,将打开一个窗口,指示该行元素的状态。在此窗口中,我可以将lockedStatus从true修改为false,反之亦然 我遇到的问题是,在Android中,对该属性所做的更改被忽略,除非完全强制

我正在使用Tianium 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
});
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
}
那么监听器是这样的:

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();
        }
    }   
});
saveFilesToDatabase函数如下所示:

Ti.App.fireEvent('updateLockedStatus', {
    lockedStatus : true //this can be true or false
});
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
}
函数saveFilesToDatabase()
{
var tempFilesArray=[];

对于(var i=0;i请尝试使用
Ti.API.firevent
&
Ti.API.addEventListener
而不是
Ti.App
执行此操作时请小心:

Ti.App.addEventListener('updateLockedStatus', function(e){
每一行都使用updateLockedStatus函数生成,该函数具有以下定义:

row.updateLockedStatus = function(lockedStatus)
{
    row.lockedStatus = lockedStatus;
}
如果上面的代码放在循环中,那么执行row.updateLockedStatus可能只影响最后一行,因为row变量被重用,并且在末尾只包含最后一行对象

您只需使用以下代码:

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);

我以前尝试过使用
this.lockedStatus=lockedStatus;
,也尝试过使用闭包,但得到了相同的结果。我正在使用Ti.API.info查看是否更新了正确的行和文件,但由于某些原因,当我返回到带有表的窗口时,这些更改没有被考虑在内。我正在考虑执行通过触发另一个事件来对表进行完整更新,但这不起作用,就像原始设置以某种方式持续存在一样。如果使用t.API.firevent/addEventListener,则应用程序根本不会启动